提问人:Programming and Maths 提问时间:8/11/2020 更新时间:8/11/2020 访问量:452
“BufferedInputStream”与“配置大小的 FileInputStream”
"BufferedInputStream" vs "FileInputStream with configured size"
问:
案例 1 => 创建了 BufferedInputStream,我想一次读取()12 个字节,但它缓冲了多达 1024 个字节(例如)以提高性能。因此,它使用 BufferedInputStream 构造函数中提供的传递的 FileInputStream 在单个 sys 调用中读取 1024 个字节。
案例 2 => 在 FileInputStream.read(byte[]) 中,我可以传递一个大小为 1024 的字节数组。这意味着在每次 sys 调用中,我的 FileInputStream 读取 1024 字节。
从案例 1 和案例 2 来看,我看不到 BufferedInputStream 在运行时性能方面提供的任何改进。它所做的只是将 FileInputStream 包装起来,并执行与我在案例 2 中所做的相同的操作。
谁能帮我更好地理解?
答:
是的,您可以通过从底层读取固定块来有效地重新实现 ,但这并不容易:BufferedInputStream
InputStream
- 首先,一个调用不能保证填满数组,你必须检查返回值。A 为您处理此问题。
read(byte[])
BufferedInputStream
- 如果您手动管理缓冲区,那么让一些数据结构跨多个缓冲区实例实现起来可能会很痛苦,提供众所周知的接口,而您的代码不必关心缓冲区。
BufferedInputStream
InputStream
- 由于最后一点可以传递给任何接受 .
BufferedInputStream
InputStream
最后只是纯 Java 代码,所以你也可以手动做它做的任何事情,但这样做的理由很少。BufferedInputStream
TL的;DR 只是一种通过减少系统调用和缓冲读取来获得一些性能的简单方法,同时仍然提供正常的接口。你可以在没有它的情况下实现它提供的一切,但几乎没有理由这样做。BufferedInputStream
InputStream
评论
read()
read(buff[]
read() 12 bytes at a time, but it buffers upto 1024 bytes
BufferedInputStream::read
read
byte[]
也许在你了解了装饰器设计模式之后,你可以更好地理解 BufferedInputstream。
BufferedInputStream 不仅仅是缓冲数据,更重要的是它实现了 InputStream 接口。您可以像对待任何其他 InputStream 一样对待它,并将其与其他 InputStream 组合在一起以创建更强大的 InputStream。
您可以根据需要实现自己的 BufferedInputStream,但我认为这并不像您想象的那么容易。
评论