чтение Java из файла, который часто обновляется - PullRequest
0 голосов
/ 07 апреля 2011

В моем Java-приложении под Linux мне нужно периодически читать некоторые текстовые файлы, которые часто меняются.(эти текстовые файлы обновляются отдельным приложением).Нужно ли беспокоиться о том редком случае, когда вы пытаетесь прочитать файл в тот момент, когда он обновляется?Если так, как я могу гарантировать, что мои чтения всегда возвращаются без сбоев?Операционная система обрабатывает это для меня, или я могу потенциально прочитать 1/2 файла?

спасибо.

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

ОС может помочь вам добиться стабильного чтения, но для этого необходимо, чтобы оба приложения были написаны с учетом этого.

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

Затем ваше другое приложение будет периодически пытаться записать файл. Если это происходит одновременно с чтением файла, доступ будет запрещен, а другое приложение должно повторить попытку. Это критическая часть, поскольку, если приложение не ожидает, что файл будет недоступен, и рассматривает это как условие фатальной ошибки, запись завершится неудачно, и приложение не сохранит данные и может завершиться с ошибкой / выйти и т. Д.

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

0 голосов
/ 07 апреля 2011

Да, вам нужно об этом беспокоиться.

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

(Если вы отправите код, мы сможем более точно прокомментировать, что произойдет.)

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