Одновременный файл чтения / записи в Java
Я должен прочитать текстовый файл из моего приложения Java.
Файл содержит много строк, и этот файл обновляется каждые X минут из неизвестного внешнего приложения, которое добавляет новые строки в файл.
Я должен прочитать все строки из файла, а затем я должен удалить все записи, которые я только что прочитал.
Можно ли разрешить мне читать файл строка за строкой, удаляя каждую прочитанную строку и в то же время позволяя внешнему приложению добавлять другие строки в файл?
Этот файл находится в общей папке Samba, поэтому я использую jCIFS для чтения / записи файла и класс BufferedReader Java.
заранее спасибо
3 ответа
Я не знаю идеальное решение вашей проблемы, но я бы решил по-другому:
- переименовать файл (дать ему уникальное имя с отметкой времени)
- задание appender автоматически создаст его заново
- обрабатывать файлы с метками времени (не нужно их удалять, оставьте их на месте, чтобы потом можно было проверить, что произошло)
Проблема в том, что мы не знаем, как внешнее приложение записывает и / или повторно использует этот файл. Это может быть проблемой, если вы удаляете строки, в то время как внешнее приложение использует счетчик для правильной работы...
Нет хорошего решения, если вы не знаете, как работает другое приложение.
Можно ли разрешить мне читать файл строка за строкой, удаляя каждую прочитанную строку и в то же время позволяя внешнему приложению добавлять другие строки в файл?
Да, вы можете открыть один и тот же файл для чтения и записи из нескольких процессов. В Linux, например, вы получите два отдельных файловых дескриптора для одного и того же файла. Для операций записи файлов размером PIPE_BUF или 4096 байт в Linux можно с уверенностью предположить, что операции являются атомарными, то есть ядро обрабатывает блокировку и разблокировку для предотвращения условий гонки.
Предполагая, что процесс A пишет в файл, открыл его как APPEND, а затем каждый раз, когда процесс A сообщает ядру write()
сначала он будет искать размер файла (конец файла). Это означает, что вы можете безопасно удалять данные в файле из Процесса B, если они выполняются между операциями записи Процесса А. И до тех пор, пока операции записи из Процесса А не превышают PIPE_BUF, Linux гарантирует, что они будут атомарными, то есть процесс A может спамить операции записи, а процесс B может постоянно удалять / записывать данные, и в этом случае не будет ничего странного.
Java предоставляет вам реализованные блокировки файлов. Но важно понимать, что это только "консультативный", а не "обязательный". Java не применяет ограничение, оба процесса должны реализовать проверку, чтобы убедиться, что другой процесс удерживает блокировку.