У меня есть приложение, которое записывает информацию в файл. Эта информация используется после выполнения для определения успешности / неудачи / правильности приложения. Я хотел бы иметь возможность читать файл по мере его написания, чтобы я мог выполнять эти проверки прохождения / сбоя / правильности в режиме реального времени.
Я предполагаю, что это возможно, но какие проблемы возникают при использовании Java? Если чтение догонит запись, будет ли оно просто ждать новых записей, пока файл не будет закрыт, или чтение вызовет исключение в этот момент? Если второе, что мне тогда делать?
Моя интуиция в настоящее время подталкивает меня к BufferedStreams. Это путь?
Ответы:
Не удалось заставить пример работать с использованием,
FileChannel.read(ByteBuffer)
потому что это не блокирующее чтение. Однако заставил работать приведенный ниже код:Конечно, то же самое могло бы работать как таймер, а не как поток, но я оставляю это на усмотрение программиста. Я все еще ищу способ получше, но пока он мне подходит.
О, и я оговорюсь: я использую 1.4.2. Да, я знаю, что все еще живу в каменном веке.
источник
Если вы хотите читать файл во время его записи и читать только новый контент, то следующее поможет вам добиться того же.
Чтобы запустить эту программу, вы запустите ее из командной строки / окна терминала и передадите имя файла для чтения. Он прочитает файл, если вы не убьете программу.
Java FileReader c: \ myfile.txt
По мере того, как вы вводите строку текста, сохраните ее из блокнота, и вы увидите текст, напечатанный в консоли.
источник
BufferedReader
создание каждого цикла при каждом вызове бессмысленно. Когда он создается один раз, в пропуске не будет необходимости, так как буферный читатель будет читать новые строки по мере их поступления.Вы также можете взглянуть на канал Java для блокировки части файла.
http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html
Эта функция
FileChannel
может быть началомВызов этого метода будет заблокирован до тех пор, пока регион не будет заблокирован.
источник
Я полностью согласен с ответом Джошуа , Тейлер подходит для этой работы в этой ситуации. Вот пример:
Он записывает строку в файл каждые 150 мс, а тот же файл читает каждые 2500 мс.
источник
Ответ вроде бы «нет» ... и «да». Кажется, нет реального способа узнать, открыт ли файл для записи другим приложением. Таким образом, чтение из такого файла будет продолжаться до тех пор, пока содержимое не будет исчерпано. Я последовал совету Майка и написал тестовый код:
Writer.java записывает строку в файл, а затем ожидает, пока пользователь нажмет Enter, прежде чем записать другую строку в файл. Идея состоит в том, что он может быть запущен, и тогда читатель может увидеть, как он справляется с «частичным» файлом. Написанный мною ридер находится в Reader.java.
Writer.java
Reader.java
Нет гарантий, что этот код является наилучшей практикой.
Это оставляет вариант, предложенный Майком, периодически проверять, есть ли новые данные для чтения из файла. Затем требуется вмешательство пользователя, чтобы закрыть программу чтения файлов, когда будет определено, что чтение завершено. Или читатель должен быть осведомлен о содержимом файла и уметь определять условие окончания записи. Если бы контент был XML, конец документа мог бы сигнализировать об этом.
источник
Не Java как таковая, но вы можете столкнуться с проблемами, когда вы что-то написали в файл, но на самом деле это еще не было написано - это может быть где-то в кеше, и чтение из того же файла может фактически не дать вам новая информация.
Краткая версия - используйте flush () или любой другой соответствующий системный вызов, чтобы гарантировать, что ваши данные действительно записаны в файл.
Обратите внимание: я не говорю о дисковом кэше уровня ОС - если ваши данные попадают сюда, они должны появиться в read () после этого момента. Возможно, сам язык кэширует записи, ожидая заполнения буфера или сброса / закрытия файла.
источник
Для этого существует графический хвост Java с открытым исходным кодом.
https://stackoverflow.com/a/559146/1255493
источник
Вы не можете прочитать файл, открытый из другого процесса с помощью FileInputStream, FileReader или RandomAccessFile.
Но использование FileChannel напрямую будет работать:
источник
Я никогда не пробовал, но вам следует написать тестовый пример, чтобы увидеть, будет ли работать чтение из потока после того, как вы дойдете до конца, независимо от того, записано ли в файл больше данных.
Есть ли причина, по которой вы не можете использовать конвейерный поток ввода / вывода? Данные записываются и читаются из одного и того же приложения (если да, то у вас есть данные, зачем вам читать из файла)?
В противном случае, возможно, можно прочитать до конца файла, затем отслеживать изменения и искать с того места, где вы остановились, и продолжить ... хотя следите за условиями гонки.
источник