java - Does FileWriter use a buffer? (it acts like it does in my example)

烂漫一生 提交于 2019-11-27 06:56:37

问题



I am using FileWriter and I have noticed strange behavior. I buffer my collection myself and every x rows I use

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

It doesnt write to the file. I continue to call it with more lines and only after it is very full it writes to the file.
Does it use a buffer? I cant find it in its documentation.


回答1:


The second sentence of the FileWriter class overview says:

The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream.

(My emphasis)

So clearly it's buffered (unless the default byte-buffer size is zero and they're being really odd with their phrasing).

I suspect it's just using an OutputStreamWriter on a FileOutputStream. Looking at OutputStreamWriter:

Each invocation of a write() method causes the encoding converter to be invoked on the given character(s). The resulting bytes are accumulated in a buffer before being written to the underlying output stream.

(My emphasis)

If you want to ensure that various buffers at various levels are flushed, to the extent you can, look at using the flush method.




回答2:


I suspect it's an implementation detail, but I would expect most implementations to use a buffer, yes. You certainly shouldn't rely on it being unbuffered. When you flush or close the writer, it should be fine.

Note that personally I dislike using FileWriter as it doesn't allow you to specify the character encoding - I would typically wrap a FileOutputStream in an OutputStreamWriter instead.




回答3:


Look at the class sun.nio.cs.StreamEncoder.CharsetSE.implWrite(). It uses a ByteBuffer.

The class StreamEncoder.CharsetSE is internally used by OutputStreamWriter which inturn is internally used by FileWriter.




回答4:


Seems that it uses buffer but in some other way (low-level, buffer could be empty by default). Need to wrap it by BufferedWriter. From 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>"


来源:https://stackoverflow.com/questions/6108043/java-does-filewriter-use-a-buffer-it-acts-like-it-does-in-my-example

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!