Java - FileWriter是否使用缓冲区?(根据我的示例,它似乎是这样做的)

7
我正在使用FileWriter,并注意到了奇怪的行为。我自己缓冲集合,每x行使用一次


 IOUtils.writelines(myList,"\n", writer );

它没有写入文件。我继续使用更多行调用它,只有在非常满的情况下才会写入文件。
它使用缓冲区吗?我在它的文档中找不到。

4个回答

12
FileWriter类概述中的第二个句子如下:

该类的构造函数默认使用 JVM 的字符编码和缺省的字节缓冲区大小。若要指定这些值,需在 FileOutputStream 上构建一个 OutputStreamWriter

(我加粗了一部分文字)

所以很明显它是有缓冲区的(除非缺省的字节缓冲区大小为0且他们的措辞非常奇怪)。我猜测它只是在 FileOutputStream 上使用了一个 OutputStreamWriter。看一下 OutputStreamWriter

每次调用 write() 方法都会将编码转换器应用于给定的字符。在写入到底层输出流之前,生成的字节会被积累在一个缓冲区中

(我加粗了一部分文字)

如果你想尽可能地确保各个级别的缓冲区都被刷新,可以考虑使用 flush 方法


感谢您详细的回答。 - Bick
@user:没问题,希望对你有所帮助。 - T.J. Crowder
谢谢您指出这一点。我在文档中也错过了它,当“tail”没有显示我的写入时,我真的很困惑! - Hamy

5

我认为这是一种实现细节,但我希望大多数实现都使用缓冲区。你当然不应该指望它是无缓冲的。当你刷新或关闭写入器时,它应该没问题。

请注意,个人不喜欢使用 FileWriter,因为它不允许您指定字符编码 - 我通常会将 FileOutputStream 包装在 OutputStreamWriter 中。


1

看起来它使用缓冲区,但方式不同(低级别,缓冲区可能默认为空)。需要用BufferedWriter包装它。来自 BufferedWriter javadoc

"In general, a Writer sends its output immediately to the underlying
 character or byte stream.  Unless prompt output is required, it is advisable
 to wrap a BufferedWriter around any Writer whose write() operations may be
  costly, such as FileWriters and OutputStreamWriters.  For example,

  <pre>
  PrintWriter out
    = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
  </pre>"

0
看一下类 sun.nio.cs.StreamEncoder.CharsetSE.implWrite()。它使用了一个 ByteBuffer
类 StreamEncoder.CharsetSE 是由 OutputStreamWriter 内部使用的,而 OutputStreamWriter 又是由 FileWriter 内部使用的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接