Как я использую Java для чтения из файла, в который активно пишется?

96
задан Joris Schellekens 2 November 2017 в 22:09
поделиться

5 ответов

Не мог заставить пример работать с помощью FileChannel.read(ByteBuffer), потому что это не чтение блокирования. Действительно однако заставлял код ниже работать:

boolean running = true;
BufferedInputStream reader = new BufferedInputStream(new FileInputStream( "out.txt" ) );

public void run() {
    while( running ) {
        if( reader.available() > 0 ) {
            System.out.print( (char)reader.read() );
        }
        else {
            try {
                sleep( 500 );
            }
            catch( InterruptedException ex ) {
                running = false;
            }
        }
    }
}

, Конечно, то же самое работало бы таймером вместо потока, но я оставляю это до программиста. Я все еще ищу лучший путь, но это работает на меня на данный момент.

, О, и я буду протест это с: я использую 1.4.2. Да я знаю, что нахожусь в каменных веках все еще.

35
ответ дан manman 24 November 2019 в 05:41
поделиться

Ответ, кажется, "нет"... и "да". Кажется, нет никакого реального способа знать, открыт ли файл для записи другим приложением. Так, чтение из такого файла будет просто прогрессировать, пока содержание не исчерпывается. Я послушал совет Mike's и записал некоторый тестовый код:

Writer.java пишет строку в файл и затем ожидает пользователя для удара, входят прежде, чем записать другую строку в файл. Идея, являющаяся этим, это могло быть запущено, тогда читатель, может быть запущена, чтобы видеть, как это справляется с "частичным" файлом. Средство чтения, которое я записал, находится в Reader.java.

Writer.java

public class Writer extends Object
{
    Writer () {

    }

    public static String[] strings = 
        {
            "Hello World", 
            "Goodbye World"
        };

    public static void main(String[] args) 
        throws java.io.IOException {

        java.io.PrintWriter pw =
            new java.io.PrintWriter(new java.io.FileOutputStream("out.txt"), true);

        for(String s : strings) {
            pw.println(s);
            System.in.read();
        }

        pw.close();
    }
}

Reader.java

public class Reader extends Object
{
    Reader () {

    }

    public static void main(String[] args) 
        throws Exception {

        java.io.FileInputStream in = new java.io.FileInputStream("out.txt");

        java.nio.channels.FileChannel fc = in.getChannel();
        java.nio.ByteBuffer bb = java.nio.ByteBuffer.allocate(10);

        while(fc.read(bb) >= 0) {
            bb.flip();
            while(bb.hasRemaining()) {
                System.out.println((char)bb.get());
            }
            bb.clear();
        }

        System.exit(0);
    }
}

Никакие гарантии, что этот код является лучшей практикой.

Это оставляет опцию предложенной Mike периодической проверки, если существуют новые данные, которые будут считаны из файла. Это тогда требует, чтобы вмешательство пользователя закрыло средство чтения файлов, когда определено, что чтение завершается. Или, читатель должен быть сделан знающим содержание файла и быть в состоянии определить и конец условия записи. Если бы содержание было XML, конец документа мог бы использоваться для передачи сигналов об этом.

3
ответ дан Anthony Cramp 24 November 2019 в 05:41
поделиться

Вы могли бы также смотреть на канал Java для блокировки части файла.

http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html

Эта функция эти FileChannel могла бы быть запуском

lock(long position, long size, boolean shared) 

, вызов этого метода заблокируется, пока регион не сможет быть заблокирован

5
ответ дан Frederic Morin 24 November 2019 в 05:41
поделиться

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

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

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

0
ответ дан Mike Stone 24 November 2019 в 05:41
поделиться

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

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

Примечание я не говорю о дисковом кэше уровня ОС - если Ваши данные входят здесь, это должно появиться в чтении () после этой точки. Может случиться так, что сам язык записи кэшей, ожидая, пока буфер не заполняется или файл, сбрасывается/закрывается.

1
ответ дан Matthew Schinckel 24 November 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: