Может ли PrintWriter писать в открытый текстовый файл (Java)

Мне нужно создать часть Java-программы, которая "тайно" регистрирует все действия, которые пользователь делает с программой. чисто для того, чтобы поймать людей, пытающихся «обмануть» систему. Дело в том, что несколько человек будут использовать одну и ту же программу на разных компьютерах.

Вся информация должна быть записана с помощью PrintWriter в один текстовый файл, который в дальнейшем будет использоваться административной частью программы.

 PrintWriter printer = new PrintWriter(new FileWriter(serverFolderLocation + "\\LogUserInfo.txt", true));

Ожидается, что более 50 компьютеров будут использовать эту программу, каждые несколько секунд ожидается, что массив из 7+ строк текста будет записываться в этот файл каждый раз, когда на компьютере нажимается определенная кнопка.

Я знаю, что запись текста в текстовый файл выполняется очень быстро, и это вряд ли произойдет, но если 2 или более компьютеров одновременно записывают в текстовый файл, а для добавления установлено значение true, пропадут ли данные? или он будет добавляться нормально?

Это вообще возможно? 2+ устройства, записывающие данные в текстовый файл в разное время?

Обратите внимание, что важно, чтобы все данные со всех 50+ компьютеров поступали в целевой файл.

Если проблемы могут возникнуть, какие другие методы можно использовать для выполнения чего-то подобного, кроме создания выделенной базы данных?


person jaco    schedule 04.09.2018    source источник
comment
Привет, Жако, добро пожаловать на сайт Unix и Linux SR. Почему вы думаете, что это вопрос unix/linux? Есть ли какая-то причина, по которой вы нам не объяснили?   -  person andcoz    schedule 04.09.2018


Ответы (2)


Установка добавления в true в FileWriter:

append - boolean, если true, то данные будут записываться в конец файла, а не в начало.

Если у вас есть 50 машин, делающих это одновременно, будут конфликты. Ваш компьютер жалуется, когда вы пытаетесь изменить файл, который используется другим процессом, не бросайте еще 50 претендентов.

Вы можете попробовать использовать Sockets.

Какая бы машина ни содержала этот файл, назначьте ее «сервером», а остальные машины сделайте «клиентами». Ваши клиенты отправляют сообщения на сервер, ваш сервер синхронно добавляет эти сообщения в файл.

Затем вы можете запретить своим ~ 50 клиентам напрямую изменять файл журнала с некоторой безопасностью сети и сервера.

person Antony H    schedule 04.09.2018
comment
Если у меня ~50 машин читают из одного файла, ничего не меняя? (Сканер) Не думаете, что это вызовет проблемы? Спасибо за ваш ответ, это определенно поможет для будущих проектов, этот проект просто должен быть выполнен с текстовыми файлами по определенным причинам. - person jaco; 05.09.2018
comment
Могут возникнуть проблемы, если файл изменяется, когда вы пытаетесь его прочитать. Подход посредника был бы лучше, поскольку он гарантирует, что в конечном итоге будет один читатель и один писатель, и что ни то, ни другое не произойдет одновременно. - person Antony H; 06.09.2018

Вы просто заново изобретаете велосипед, но очень неправильным способом. Другой ответ правильный: использование простого файла и запись нескольких распределенных пользователей в один и тот же файл просто кричит об отказе.

Но я не согласен с идеей использовать вместо этого сокеты. Это действительно низкий уровень и требует, чтобы вы сами реализовали множество (сложных) вещей. Вам придется подумать о сетевых проблемах, многопоточности, блокировке, буферизации,...

Конечно, если это для образования, то создать что-то подобное — непростая задача. Но если ваша цель — найти надежное решение, которое просто работает, вам лучше подумать об использовании готового решения стороннего производителя.

Вы можете начать читать здесь. А затем выберите фреймворк, например logback. В качестве альтернативы вы можете изучить службы обмена сообщениями, такие как ActiveMQ или RabbitMQ.

Еще раз: создание и сбор журналов в распределенных средах: А) сложно решить правильно, но Б) проблема решена.

person GhostCat    schedule 04.09.2018
comment
Спасибо за ваш ответ! В итоге я заставил каждый компьютер создавать новый текстовый файл с именем своего IP-адреса и писать в него, после чего все обрабатывается в один текстовый файл, я знаю, что использование текстовых файлов может показаться неуместным для того, что возможно с другим программным обеспечением, но проект состоит в том, чтобы как можно меньше сервисов делали как можно больше, я очень ценю ваш ответ, так как он полезен для будущих проектов! - person jaco; 05.09.2018
comment
Конечно, и я ценю возвращение! Всегда приятно услышать ответ. И идея с одним файлом на узел — хороший компромисс. - person GhostCat; 05.09.2018