Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 性能:BufferedOutputStream与FileWriter_Java_Performance_File Io_Filewriter_Disk Io - Fatal编程技术网

Java 性能:BufferedOutputStream与FileWriter

Java 性能:BufferedOutputStream与FileWriter,java,performance,file-io,filewriter,disk-io,Java,Performance,File Io,Filewriter,Disk Io,我一直使用Java将文本写入文件。显然你也可以用a。仔细阅读了这两个javadoc之后,我似乎无法判断哪个更快/更高效 所以我问:这两种文件I/O方法之间是否存在性能差异(即使差异很小)?如果是,它们是什么?为什么?如果不是,为什么它们实际上是相同的 是否存在一种方案优于另一种方案?提前谢谢 FileWriter将文本写入文件,而BufferedOutputStream在将任意二进制数据写入您必须提供的另一个二进制流之前,在内存中保存一个缓冲区。他们根本不做相同的事情,所以比较他们的表现是没有意

我一直使用Java将文本写入文件。显然你也可以用a。仔细阅读了这两个javadoc之后,我似乎无法判断哪个更快/更高效

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


是否存在一种方案优于另一种方案?提前谢谢

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

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


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

如果您真的想比较
文件编写器
缓冲输出流
来编写文本文件,后者应该更快,因为I/O操作更少

  • 对于
    FileWriter
    ,对write方法的每次调用都将立即被持久化(它是无缓冲的)
  • 对于
    缓冲输出流
    ,如果缓冲区已满(或使用
    刷新
    方法明确刷新缓冲区),则数据将写入磁盘

但是如果你写文本文件,你应该使用
编写器
;在这种情况下,我们可以将
文件编写器
缓冲编写器
进行比较:

bw.write("Hello");
看着

FileWriter fw = new FileWriter(...)

关于I/O操作的数量,您也有相同的情况


FileWriter
在内部使用
FileOutputStream
。使用
FileWriter
的原因是,当您写入文件时,它会自动使用默认字符编码(例如,Java内部字符串被编码为UTF-8)。如果使用
输出流
,则必须在每次写入时手动编码:

因此,对于
BufferedWriter
,这个示例如下:

bw.write("Hello");
对应于
缓冲输出流的该示例:

bos.write("Hello".getBytes(Charset.forName("utf-8")));
如果您的默认编码是
utf-8


OutputStream
处理(原始)字节,而
Writer
处理(文本)字符。

谢谢@Joni(+1)-有趣的观察,但是你不能用
bufferedoutstream
将文本写入文件吗?!?我似乎不这么认为。如果这篇文章是真的,那么尽管
FileWriter
BufferedOutputStream
可能有两种不同的用途,但在将文本写入文件时,可以比较它们的性能(这也是我的问题所在)。同样,非常有趣的东西@Joni!根据,似乎可以覆盖
FileWriter
使用的内部缓冲区。如果没有别的原因,我想试试这个,作为我个人的娱乐。就我的一生而言,我不知道如何配置
OutputStreamWriter
FileOutputStream
并将它们注入
FileWriter
构造函数-有什么想法吗?在哪里指定新的缓冲区大小?再次感谢迄今为止所有的巨大帮助!正如您在文章中所看到的,为了使用
BufferedOutputStream
编写文本,首先,他们通过校准
getBytes
,手动将任何文本转换为字节,这很不方便,会创建一个立即变成垃圾的字节数组
FileWriter
实际上是
OutputStreamWriter
的一个子类,因此它只能写入
FileOutputStream
,因此,如果您想自定义某些属性,只需创建一个连接到
FileOutputStream
OutputStreamWriter
。但是,无法更改内部缓冲区大小。默认的8k缓冲区对于大多数应用程序来说可能足够大。