"3.95.131.208 - 3.95.131.208"

Параллельный файл чтения/записи в Java

Мне нужно прочитать текстовый файл из моего приложения Java.

Файл содержит много строк, и этот файл обновляется каждые X минут от внешнего неизвестного приложения, которое добавляет новые строки в файл.

Мне нужно прочитать все строки из файла, а затем удалить все записи, которые я только что прочитал.

Можно ли разрешить мне читать файл по строкам, удаляя каждую прочитанную строку и в то же время позволяя внешнему приложению добавлять в файл другие строки?

Этот файл находится в общей папке Samba, поэтому я использую jCIFS для чтения/записи файла и класса BufferedReader Java.

заблаговременно

+6
источник поделиться
3 ответа

Я не знаю идеального решения вашей проблемы, но я бы решил это по-другому:

  • переименуйте файл (дайте ему уникальное имя с меткой времени)
  • задание appender автоматически заново создаст его.
  • обрабатывать ваши файлы с отметкой времени (нет необходимости их удалять, держать их на месте, чтобы позже проверить, что произошло)
+2
источник

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

Нет хорошего решения, если вы не знаете, как работает другое приложение.

+1
источник

Можно ли разрешить мне читать файл по строкам, удаляя каждую прочитанную строку и в то же время позволяя внешнему приложению добавлять в файл другие строки?

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

Предполагая, что процесс A записывает в файл, он открыл его как APPEND, тогда каждый раз, когда процесс A сообщает ядру write(), он сначала будет искать размер файла (конец файла). Это означает, что вы можете безопасно удалять данные в файле из процесса B, пока это делается между операциями записи процесса A. И пока операции записи из процесса A не превышают PIPE_BUF, Linux гарантирует, что они будут атомарными, т.е. процесс A может спамить операции записи, а процесс B может постоянно удалять/записывать данные, и не будет причудливого поведения.

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос