问题描述
情况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,但我认为这并不像您想的那么容易。