【问题标题】:Update text file with BufferedWriter使用 BufferedWriter 更新文本文件
【发布时间】:2010-02-17 22:49:37
【问题描述】:

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

【问题讨论】:

  • 在关闭它之前你不会刷新它,所以我不确定你的倒数第二句话是什么意思。
  • 我读到它应该在写入的所有时间都刷新,但是没有创建文件作为应该写入的东西。
  • 不,它应该在缓冲区填满时刷新。如果您希望它更频繁地刷新,则必须自己手动进行。但你为什么在乎? BufferedWriter 用于提高效率。如果您不想要,请不要使用它。但是文件内容在大多数情况下基本上是没有用的,直到它完成。
  • 您认为 PrintWriter 会做些什么不同的事情吗?我意识到,如果我希望在处理输出时立即输出,我可能不应该使用 BufferedWriter,但还有什么可以工作的呢?
  • 您能否更新您的问题以显示代码的最正确的非工作版本?

标签: java flush bufferedwriter


【解决方案1】:

您需要将 flush() 调用移动到 try 块中。例如在每次newLine() 调用之后。

也就是说,finally 中的 flush() 是多余的,因为 close() 已经隐式调用它。

【讨论】:

  • 我相信我之前确实尝试过,但没有成功,但我确实将它移回去再次尝试,结果仍然相同
  • 那么文件显然已经被同一个程序中的其他东西打开/锁定了。如果您尝试将其写入不同的文件怎么办?例如。 "c:/test.txt" 左右。
  • 该文件仅在该时间点创建。没有其他具有该名称的现有文件。
  • 什么平台?什么JVM版本?无法在 WinXP 上使用 1.6.0_17-b04 重现此内容。我以前也从未见过这个问题。问题不在于您如何测试/验证行是否已写入/刷新吗?
  • 使用 JVM 1.6.0_17 在 Eclipse 中运行...除了检查是否创建了文件之外,我还能如何测试它是否已被写入/刷新?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    完全跳过缓冲

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

    如果这不起作用,我不知道会怎样..

    【讨论】:

    • 我尝试了两种方法,但什么都没有……而且 BufferedWriter 和 FileWriter 都没有 writeln() 方法
    • @Brandon:抱歉,没有 IDE。更新了我的第二个示例以使用 PrintWriter java.sun.com/javase/6/docs/api/java/io/PrintWriter.html,它应该启用自动刷新,因此应该可以正常工作。请问如何在运行程序时测试文件是否正确刷新?
    • 好吧,如果它被刷新,那么在第一次处理某些内容时会创建一个文件并继续输出到该文件......但直到所有内容都处理完毕后才会创建文件。
    • 我尝试以与 BufferedWriter 相同的方式实现 PrintWriter,但也没有用...
    • @Brandon:你调用了正确的 PrintWriter 和 FileWriter 构造函数吗?两者都应该添加一个布尔值 true,第一个表示您希望在每一行上自动刷新,第二个表示启用附加。上面的代码示例应该可以正常工作..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多