“BufferedInputStream”与“配置大小的 FileInputStream”

"BufferedInputStream" vs "FileInputStream with configured size"

提问人:Programming and Maths 提问时间:8/11/2020 更新时间:8/11/2020 访问量:452

问:

案例 1 => 创建了 BufferedInputStream,我想一次读取()12 个字节,但它缓冲了多达 1024 个字节(例如)以提高性能。因此,它使用 BufferedInputStream 构造函数中提供的传递的 FileInputStream 在单个 sys 调用中读取 1024 个字节。

案例 2 => 在 FileInputStream.read(byte[]) 中,我可以传递一个大小为 1024 的字节数组。这意味着在每次 sys 调用中,我的 FileInputStream 读取 1024 字节。

从案例 1 和案例 2 来看,我看不到 BufferedInputStream 在运行时性能方面提供的任何改进。它所做的只是将 FileInputStream 包装起来,并执行与我在案例 2 中所做的相同的操作。

谁能帮我更好地理解?

Java 文件-IO IOTrom BufferedInputStream

评论

0赞 Joachim Sauer 8/11/2020
请注意,案例 #2 不保证读取 1024 个字节。它可能会更少。

答:

1赞 Joachim Sauer 8/11/2020 #1

是的,您可以通过从底层读取固定块来有效地重新实现 ,但这并不容易:BufferedInputStreamInputStream

  • 首先,一个调用不能保证填满数组,你必须检查返回值。A 为您处理此问题。read(byte[])BufferedInputStream
  • 如果您手动管理缓冲区,那么让一些数据结构跨多个缓冲区实例实现起来可能会很痛苦,提供众所周知的接口,而您的代码不必关心缓冲区。BufferedInputStreamInputStream
  • 由于最后一点可以传递给任何接受 .BufferedInputStreamInputStream

最后只是纯 Java 代码,所以你也可以手动做它做的任何事情,但这样做的理由很少。BufferedInputStream

TL的;DR 只是一种通过减少系统调用和缓冲读取来获得一些性能的简单方法,同时仍然提供正常的接口。你可以在没有它的情况下实现它提供的一切,但几乎没有理由这样做。BufferedInputStreamInputStream

评论

0赞 dbl 8/11/2020
当我们谈到性能时,流之间存在差异和暴露......将一种实现与另一种实现进行比较时,应采用类似的方法。read()read(buff[]
0赞 Joachim Sauer 8/11/2020
我不太确定你想说什么,@dbl。
0赞 dbl 8/11/2020
OP 说: 在这样的使用场景中,每次读取操作将返回 1byte,而不是 1k...read() 12 bytes at a time, but it buffers upto 1024 bytesBufferedInputStream::read
0赞 Joachim Sauer 8/11/2020
我不相信他实际上指的是那里的无参数方法,或者他只是没有指定参数类型......readbyte[]
0赞 haoyu wang 8/11/2020 #2

也许在你了解了装饰器设计模式之后,你可以更好地理解 BufferedInputstream。

BufferedInputStream 不仅仅是缓冲数据,更重要的是它实现了 InputStream 接口。您可以像对待任何其他 InputStream 一样对待它,并将其与其他 InputStream 组合在一起以创建更强大的 InputStream。

您可以根据需要实现自己的 BufferedInputStream,但我认为这并不像您想象的那么容易。