6


我正在使用 FileWriter,但我注意到了奇怪的行为。我自己缓冲我的收藏和我使用的每 x 行

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

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

4

4 回答 4

12

类概述FileWriter第二句话说:

此类的构造函数假定默认字符编码和默认字节缓冲区大小是可以接受的。要自己指定这些值,请在 FileOutputStream 上构造一个 OutputStreamWriter。

(我的重点)

很明显它是缓冲的(除非默认的字节缓冲区大小为零并且它们的措辞非常奇怪)。

我怀疑它只是OutputStreamWriter在 a 上使用 a FileOutputStream。看着OutputStreamWriter

每次调用 write() 方法都会导致对给定字符调用编码转换器。结果字节在写入底层输出流之前累积在缓冲区中。

(我的重点)

如果您想确保刷新各个级别的各种缓冲区,请尽可能使用该flush方法

于 2011-05-24T09:06:47.463 回答
5

我怀疑这是一个实现细节,但我希望大多数实现都使用缓冲区,是的。你当然不应该依赖它是无缓冲的。当您刷新或关闭编写器时,应该没问题。

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

于 2011-05-24T09:05:17.903 回答
0

看课sun.nio.cs.StreamEncoder.CharsetSE.implWrite()。它使用ByteBuffer

类 StreamEncoder.CharsetSE 由 OutputStreamWriter 内部使用,而后者又由 FileWriter 内部使用。

于 2011-05-24T09:36:14.457 回答
0

似乎它使用缓冲区但以其他方式(低级,缓冲区默认为空)。需要用 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>"
于 2013-08-07T13:07:47.970 回答