【问题标题】:BufferedWriter: Write to file before it is closedBufferedWriter:在文件关闭之前写入文件
【发布时间】:2017-03-21 13:02:31
【问题描述】:

所以在我的程序中,我有一个BufferedWriter,用于创建程序正在执行的日志文件。

private BufferedWriter logWriter;
logWriter = new BufferedWriter(new FileWriter(logFile));

在几个不同时间的几个类中,我调用以下方法继续添加到日志文件中:

public void log(String logTXT)
{
    try
    {
        logWriter.write(logTXT + "\n");
    } catch(Exception e)
    {
        e.printStackTrace();
    }
}

这一切都很好,但它所做的一件事是它实际上并没有写入文件,直到我调用 logWriter.close();

我希望看到的是在调用方法后立即将字符串添加到文件中。无论如何我可以解决这个问题,还是我只能忍受这个,考虑到这不是什么大问题。

【问题讨论】:

  • 你试过阅读javadocs吗? docs.oracle.com/javase/7/docs/api/java/io/… 或许?
  • @Ryan :我可以看到您得到了答案,但是如果您想弄清楚为什么会发生这种情况,我会尝试向您解释。请检查一下。

标签: java file java-io bufferedwriter


【解决方案1】:

让我试着用详细的描述来解释您的查询以及如何解决您的问题。

首先BufferWriter 开始将所有数据存储在它自己的缓冲区(这是基于内存分配的),一旦缓冲区已满,它就开始写入其中,然后再次返回使该缓冲区已满。

这非常重要,因为 IO 操作成本太高,因此为了提高效率,这种缓冲技术应运而生。

但是,如果您想在文件中写下来,而不管缓冲区是否已满,您可以使用一种方法 flush() 来解决您的问题。

现在让我们考虑一下您的情况:当您调用close() 方法时,它会在内部调用flush() 方法,然后继续关闭该缓冲区。这就是为什么关闭它时可以看到变化。

总而言之,只需在写完所有内容后调用 logWriter.flush(); 即可完成(如果您希望 BufferedReader 在特定时间写下来)。

通过使用所有这些,您可以创建自己的自定义方法,可以立即编写。

public void writeInstantText(BufferedWriter logWriter, String logTXT ){
  try
    {
        logWriter.write(logTXT + "\n");
        logWriter.flush();
    } catch(Exception e)
    {
        e.printStackTrace();
    }
}

或者只是在write() 方法之后添加logWriter.flush()

【讨论】:

  • 我从其他 cmets 和答案中得到了同样多的东西,但我很感谢你的彻底回答,谢谢。
  • 太好了。你足够好,你可以理解,但我为所有其他人写了这个答案,如果将来我们会读它......因为他们不会读所有的 cmets。并回答。他们只会遵循接受的答案或高度投票的答案。像我这样做。 :)
【解决方案2】:

BufferedWriter 有一个缓冲区,所以在缓冲区填满之前它不会写入磁盘(除非你调用了 flush 或 close 方法)

您可以使用 PrintWriter。

【讨论】:

  • PrintWriter 还需要 flush()close()
  • PrintWriter有构造方法PrintWriter(OutputStream out, boolean autoFlush)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多