【问题标题】:"BufferedInputStream" vs "FileInputStream with configured size"“BufferedInputStream”与“配置大小的 FileInputStream”
【发布时间】:2020-11-30 20:16:05
【问题描述】:

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

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

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

谁能帮我更好地理解?

【问题讨论】:

  • 请注意,案例 #2 不能保证读取 1024 个字节。可能会更少。

标签: java file-io stream iostream bufferedinputstream


【解决方案1】:

是的,您可以通过从底层 InputStream 读取固定块来有效地重新实现 BufferedInputStream 所做的事情,但这并不那么容易:

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

归根结底,BufferedInputStream 只是纯 Java 代码,因此您可以手动执行它所做的任何事情,但这样做的理由很少。

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

【讨论】:

  • 当我们谈到性能时,read() 和 read(buff[] 之间存在差异...
  • 我不太确定你想说什么,@dbl。
  • OP 说:read() 12 bytes at a time, but it buffers upto 1024 bytes 在这种使用场景中,BufferedInputStream::read 每次读取操作将返回 1 个字节,而不是 1k...
  • 我不相信他实际上是指上面的无参数 read 方法,或者他只是没有指定 byte[] 参数类型......
【解决方案2】:

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

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

你可以随心所欲地实现自己的BufferedInputStream,但我认为这并不像你想象的那么容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2017-09-21
    • 2013-11-02
    • 2019-03-09
    • 2014-10-25
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多