3

我正在使用 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,但在写入后仍然没有文件,而是在程序完成时。有什么建议么?

4

3 回答 3

3

您需要将flush()呼叫移动到try块中。例如每次newLine()通话后。

也就是说,flush()infinally是多余的,正如close()已经隐含的那样。

于 2010-02-17T22:58:17.923 回答
0

为了完全清楚,这是您需要添加刷新的地方,如果您想在写入时刷新每一行:

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{} 块完成执行后才会执行。

于 2010-02-18T00:15:59.433 回答
0

完全跳过缓冲

您只是按原样打印整行,因此在上面的示例中失去了它提供的优于 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

如果这不起作用,我不知道会发生什么..

于 2010-02-17T23:21:54.173 回答