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

问题描述

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

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

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

有人可以帮助我更好地理解吗?

解决方法

是的,您可以通过从基础BufferedInputStream读取固定的块来有效地重新实现InputStream的功能,但这并不那么容易:

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

最后BufferedInputStream只是纯Java代码,因此您 也可以手动完成任何操作,但是这样做的理由很少。

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

,

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

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...