gpt4 book ai didi

java - BufferedInputStream 如何从操作系统请求数据 block

转载 作者:行者123 更新时间:2023-11-30 01:43:46 25 4
gpt4 key购买 nike

我读了这个问题:Why is using BufferedInputStream to read a file byte by byte faster than using FileInputStream?据作者称,BufferedInputStream(BIS)FileInputStream(FIS) 更快,因为在 FileInputStream 中调用方法 read() 时> 它总是使用 native API 进行系统调用以获取单个字节,而 BufferedInputStream 执行相同的操作,但它需要来自操作系统的字节 block 并将它们存储在名为 buf 的本地字段中> 在 BIS 类中声明,然后当调用 read() 时,BIS 从 buf 数组返回字节。

我查看了 BIS 的代码,特别是 read() 方法,但我不清楚它何时发生,何时 BIS 需要一大块字节而不是一个字节。方法 read() 首先检查 if (pos >= count) 如果是,则调用 fill() 方法,该方法首先检查 buf 是否已满,如果 buf 有空间,则调用 InputStream 的方法 public int read(byte b[], int off, int len) 其中 b[] 是我们的缓冲区,在该方法内部我们可以看到它在循环内进行系统调用,等于 len param 。

for (; i < len ; i++) {
c = read();

我是否错过了什么,或者 BIS 和 FIS 类都会执行相同数量的系统调用以便分别获取每个字节?

最佳答案

您找错地方了。

InputStream 提供了 int read(byte[] b, int off, int len) 的实现,它确实在循环中调用 read()。因此,如果 BufferdInputStream 包装的具体 InputStream 不重写此方法,则不会有性能提升。但是,您链接的问题专门讨论了 FileInputStream,它确实通过调用native int readBytes(byte b[], int off, int len)来覆盖此方法。

关于java - BufferedInputStream 如何从操作系统请求数据 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58966162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com