9

我一直使用 aFileWriter在 Java 中将文本写入文件。显然你也可以使用 a BufferedOutputStream。在仔细阅读了两个 javadocs 之后,我似乎无法分辨哪个更快/更有效。

所以我问:这两种文件 I/O 方法之间是否存在性能差异(即使是最小的)?如果是这样,它们是什么,为什么?如果不是,为什么它们实际上是相同的?

是否存在其中一种优于另一种的情况?提前致谢!

4

2 回答 2

10

如果你真的想比较 aFileWriter和 aBufferedOutputStream来写一个文本文件,后者应该更快,因为 I/O 操作更少。

  • 在 的情况下FileWriter,对 write 方法的每次调用都将立即持久化(它是无缓冲的)。
  • 在 a 的情况下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处理(文本)字符。

于 2013-07-08T14:54:03.457 回答
3

AFileWriter文本写入文件,而 aBufferedOutputStream在内存中保存任意二进制数据的缓冲区,然后再将其写入您必须提供的另一个二进制流。他们根本不做同样的事情,所以比较他们的表现是没有意义的。

一般来说,缓冲提高了应用程序的吞吐量,但增加了延迟。对于文件,您可以每秒产生更多的输出,因为您可以一次将较大的块传输到磁盘,因此每字节的开销较低。另一方面,当数据在内存中缓冲时,它不会被写入磁盘,因此任何特定字节都需要更长的时间才能写入磁盘。

在 的情况下FileWriter,它已经有一个内部缓冲区,可以帮助将字符编码为字节。添加更多缓冲可能没有什么价值。

于 2013-07-08T14:20:35.367 回答