我一直使用 aFileWriter
在 Java 中将文本写入文件。显然你也可以使用 a BufferedOutputStream
。在仔细阅读了两个 javadocs 之后,我似乎无法分辨哪个更快/更有效。
所以我问:这两种文件 I/O 方法之间是否存在性能差异(即使是最小的)?如果是这样,它们是什么,为什么?如果不是,为什么它们实际上是相同的?
是否存在其中一种优于另一种的情况?提前致谢!
我一直使用 aFileWriter
在 Java 中将文本写入文件。显然你也可以使用 a BufferedOutputStream
。在仔细阅读了两个 javadocs 之后,我似乎无法分辨哪个更快/更有效。
所以我问:这两种文件 I/O 方法之间是否存在性能差异(即使是最小的)?如果是这样,它们是什么,为什么?如果不是,为什么它们实际上是相同的?
是否存在其中一种优于另一种的情况?提前致谢!
如果你真的想比较 aFileWriter
和 aBufferedOutputStream
来写一个文本文件,后者应该更快,因为 I/O 操作更少。
FileWriter
,对 write 方法的每次调用都将立即持久化(它是无缓冲的)。BufferedOutputStream
,如果缓冲区已满(或使用该flush
方法显式刷新缓冲区),数据将被写入磁盘。但是如果你写文本文件,你应该使用Writer
; 在这种情况下,我们可以将 aFileWriter
与 a进行比较BufferedWriter
:
看着
FileWriter fw = new FileWriter(...)
和
BufferedWriter bw = new BufferedWriter(new FileWriter(...)
关于 I/O 操作的数量,您也有同样的情况。
A在内部FileWriter
使用 a FileOutputStream
。使用 a 的原因FileWriter
是它会在您写入文件时自动使用默认字符编码(例如,Java 内部字符串被编码为 UTF-8)。如果使用OutputStream
,则必须在每次写入时手动编码:
所以这个例子是BufferedWriter
:
bw.write("Hello");
对应于 a 的示例BufferedOutputStream
:
bos.write("Hello".getBytes(Charset.forName("utf-8")));
如果您的默认编码是utf-8
.
AnOutputStream
处理(原始)字节,而 aWriter
处理(文本)字符。
AFileWriter
将文本写入文件,而 aBufferedOutputStream
在内存中保存任意二进制数据的缓冲区,然后再将其写入您必须提供的另一个二进制流。他们根本不做同样的事情,所以比较他们的表现是没有意义的。
一般来说,缓冲提高了应用程序的吞吐量,但增加了延迟。对于文件,您可以每秒产生更多的输出,因为您可以一次将较大的块传输到磁盘,因此每字节的开销较低。另一方面,当数据在内存中缓冲时,它不会被写入磁盘,因此任何特定字节都需要更长的时间才能写入磁盘。
在 的情况下FileWriter
,它已经有一个内部缓冲区,可以帮助将字符编码为字节。添加更多缓冲可能没有什么价值。