2016-08-04 9 views
6

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

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

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

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

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

заранее спасибо

+0

Изменение файла, написанного приложением, которое не находится под вашим контролем, является плохой идеей. Почему вам нужно удалить?Возможно, достаточно было бы сохранить маркер количества строк, которые вы прочитали до сих пор, не меняя файл? – RealSkeptic

+0

Это то, что было сделано для команд 'Socket Writing' и' RESTful POST'. –

+0

@RealSkeptic Мне нужно удалить или обновить строки, которые я только что прочитал, потому что я думаю, что это самый простой способ пометить строки как «уже обработанные». После обработки строки я должен хранить в таблице MySQL, поэтому мне больше не нужно оставлять строки в файле. –

ответ

1

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

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

2

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

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

"задание для добавления потом автоматически заново создаст его" -> Не уверен, например, если он делает это только при запуске. – N0un

+0

@ N0un не уверен, правда, но стоит того. –

+0

@SeanPatrickFloyd Если клиент не ожидает, что их приложение будет делать это очень определенным образом в производственной среде. –

0

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

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

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

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

+0

Запирание? Linux справится с этим? Можете ли вы показать документацию, подтверждающую это утверждение? – RealSkeptic

+0

@RealSkeptic Я не могу найти официальный пост от Линуса Торвальда. Но если вы это сделаете, вы найдете множество доказательств в книгах, на веб-сайтах и ​​в операционных системах. [Вот один пример] (http://www.cim.mcgill.ca/~franco/OpSys-304-427/lecture-notes/node27.html). Кроме того, больше [поддержка stackoverflow] (http://stackoverflow.com/a/2751750/1241782). –

+0

* Для записи файлов под размер PIPE_BUF или 4096 байт в Linux можно с уверенностью предположить, что операции являются атомарными, то есть ядро ​​обрабатывает блокировку и разблокировку, чтобы предотвратить условия гонки. * Обычно верно, но в этом случае это общую файловую систему, которая, по-видимому, обновляется по сетевым соединениям. Чтение из написанного файла достаточно сложно сделать надежно с низкоуровневым кодом C в локальном файле - сделать это в Java через сеть * и * изменять файл одновременно с процессом записи, в лучшем случае будет крайне сложно , –