"BufferedInputStream" 对比 "FileInputStream with configured size"

"BufferedInputStream" vs "FileInputStream with configured size"

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

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

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

谁能帮助我更好地理解?

是的,您可以有效地 re-implement 通过从底层 InputStream 读取固定块来执行 BufferedInputStream 的操作,但这并不那么容易:

  • 首先,read(byte[]) 调用不能保证填充数组,您必须检查 return 值。 BufferedInputStream 会为您处理。
  • 如果您手动管理您的缓冲区,那么让一些数据结构跨越多个缓冲区实例可能很难实现,BufferedInputStream 提供了 well-known InputStream 接口,您的代码无需关心缓冲。
  • 由于最后一点 BufferedInputStream 可以传递给任何接受 InputStream.
  • 的东西

最终 BufferedInputStream 只是纯 Java 代码,因此您 可以 手动执行任何操作,但原因很少这样做。

tl;dr BufferedInputStream 只是通过减少系统调用和缓冲读取来获得一些性能的简单方法,同时仍然提供正常的 InputStream 接口.如果没有它,您可以实现它提供的一切,但几乎没有理由这样做。

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

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

你可以随心所欲地实现你自己的BufferedInputStream,但我觉得它并没有你想象的那么容易。