Обновить текстовый файл с помощью BufferedWriter - PullRequest
3 голосов
/ 18 февраля 2010

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

FileWriter fw = null;
try {
    fw = new FileWriter("C:/.../" + target + ".pscr",true);
    writer = new BufferedWriter(fw);
    writer.write(target);
    writer.newLine();
    writer.write(Integer.toString(listOfFiles.length));
    writer.newLine();
    for(int i=0; i < listOfFiles.length; i++){
        writer.write(probeArray[i] + "\t" + probeScoreArray[i]);
        writer.newLine();                               
    }                           
}
catch (IOException e1) {e1.printStackTrace();}
catch (RuntimeException r1) {r1.printStackTrace();}
finally {
    try {
        if(writer != null){
            writer.flush();
            writer.close();
        }
    }
    catch (IOException e2) {e2.printStackTrace();}
}

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

Ответы [ 3 ]

3 голосов
/ 18 февраля 2010

Вам необходимо переместить вызов flush() в блок try. Например, после каждого newLine() звонка.

Тем не менее, flush() в finally является избыточным, поскольку close() уже неявно называет его.

0 голосов
/ 18 февраля 2010

Просто для полной ясности, здесь вам нужно добавить сброс, если вы хотите сбросить каждую строку, как написано:

for(int i=0; i < listOfFiles.length; i++){
    writer.write(probeArray[i] + "\t" + probeScoreArray[i]);
    writer.newLine();
    writer.flush(); // Make sure the flush() is inside the for loop
}

В вашем коде flush () не происходит до конца программы, потому что блок finally {} не выполняется до тех пор, пока не завершится выполнение блока try {} или catch {}.

0 голосов
/ 18 февраля 2010

Пропустить буферизацию полностью :

Вы печатаете только каждую целую строку как есть, поэтому преимущества, которые она предлагает по сравнению с PrintWriter, теряются в приведенном выше примере из-за вызовов очистки после каждой записи строки. Как описано здесь: http://java.sun.com/javase/6/docs/api/java/io/BufferedWriter.html

PrintWriter pw = null;
try {
    pw = new PrintWriter(new FileWriter("C:/.../" + target + ".pscr", true), true);
    pw.println(target);
    pw.println(Integer.toString(listOfFiles.length));
    for(int i=0; i < listOfFiles.length; i++)
        pw.println(probeArray[i] + "\t" + probeScoreArray[i]);
}

Последнее обновление :
Вызывается конструктор PrintWriter(Writer out, boolean autoFlush), который согласно Javadoc имеет следующее поведение:

autoFlush - if true, the println, printf, or format methods will flush the output buffer

Если это не сработает, я не знаю, что будет ..

...