如何解决java-FileWriter是否使用缓冲区? 其行为与我的示例相同
| 我正在使用FileWriter,并且注意到了奇怪的行为。 我自己和我使用的每x行缓冲我的收藏 IOUtils.writelines(myList,\"\\n\",writer );
它不会写入文件。我继续用更多的行来称呼它,直到它写满后才写入文件。
它使用缓冲区吗?我在其文档中找不到它。
解决方法
ѭ1类概述的第二句话说:
此类的构造函数假定默认字符编码和默认字节缓冲区大小是可接受的。要自己指定这些值,请在FileOutputStream上构造一个OutputStreamWriter。
(我的重点)
显然,它是经过缓冲的(除非默认的字节缓冲区大小为零,并且它们的措词确实很奇怪)。
我怀疑它只是在
FileOutputStream
上使用了OutputStreamWriter
。看OutputStreamWriter
:
每次调用write()方法都会导致在给定的字符上调用编码转换器。生成的字节在写入底层输出流之前先在缓冲区中累积。
(我的重点)
如果要确保刷新各个级别的各种缓冲区,请使用flush
方法。
,我怀疑这是一个实现细节,但是我希望大多数实现都使用缓冲区。您当然不应该依赖它的无缓冲。刷新或关闭编写器时,应该没问题。
请注意,我个人不喜欢使用FileWriter
,因为它不允许您指定字符编码-我通常将FileOutputStream
换成OutputStreamWriter
。
,看课sun.nio.cs.StreamEncoder.CharsetSE.implWrite()
。
它使用一个ByteBuffer。
OutputStreamWriter内部使用StreamEncoder.CharsetSE类,而FileWriter内部使用该类。
,似乎它使用缓冲区但以其他方式使用(低级,默认情况下缓冲区可以为空)。需要通过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>\"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。