Как я могу создать и записать File one Java Process и читать из другого процесса, не сталкиваясь с проблемами чтения / записи (Java / EE) - PullRequest
1 голос
/ 04 декабря 2010

МОЯ ситуация

У меня есть процесс, который выполняет FTP, и другой процесс, который отправляет электронную почту.

Пока я заканчиваю работу с FTP, я хочу отправить уведомление об успехе по электронной почте.Таким образом, процесс электронной почты отслеживает поступление нового файла конфигурации файла pr в определенный каталог

Процесс FTP создает файл, соответствующий процессу электронной почты, который представляет собой более или менее список электронных писем в файле свойств.

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

Что я могу использовать для создания файла свойств, который не может быть прочитанпока полностью не написано - или создать файл свойств с блокировкой, который может быть разблокирован из другого процесса, если это необходимо.

Какие у меня есть выбор?

Насколько сейчас: - У меня естьпопытался использовать настройку Apache Commons для установки SetProperty, это создало ту же старую проблему доступа для чтения / записи - я создал свойство property = new и использовал метод store для создания файла.Даже в этом случае процесс электронной почты будет считан до того, как он будет полностью

К вашему сведению: у процесса электронной почты был WatchDirectory, и он считывает каждый раз, когда создается новый файл.

Ответы [ 2 ]

5 голосов
/ 04 декабря 2010

Вам необходимо выполнить операцию, которая является «атомарной» в отношении файловой системы. Запишите файл под другим именем файла (например, .tmpfoobar), и когда вы закончите, закройте его и сделайте File.renameTo(), чтобы переместить его на место. Переименования атомарные.

0 голосов
/ 04 декабря 2010

Не уверен, почему за вас проголосовали, поскольку это кажется стоящим вопросом.

Мартин предлагает использовать переименование файла, чтобы выполнить это: сначала запишите файл с временным именем, а затем переименуйте его.Затем, если другой процесс / поток получает доступ только к переименованным файлам, тогда вам будет хорошо, если переименования действительно атомарные.

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

Эта страница и другие на javamex.com содержат довольно неплохие объяснения параллельного программирования на Java:

http://www.javamex.com/tutorials/synchronization_concurrency_1.shtml

...