我正在以 1021 字节的 block 读取任意大小的文件,文件最终 block 的 block 大小 <= 1021 字节。目前,我正在使用 BufferedInputStream
来执行此操作,它包裹在 FileInputStream
周围,代码看起来(大致)如下所示(其中 reader
> 是 BufferedInputStream
并且它在循环中运行):
int availableData = reader.available();
int datalen = (availableData >= 1021)
? 1021
: availableData;
reader.read(bufferArray, 0, datalen);
但是,通过阅读 API 文档,我注意到 available()
在调用“阻塞”之前仅给出可用大小的“估计”。每次迭代打印出 availableData
的值似乎给出了预期值 - 从文件大小开始,慢慢变小,直到 <= 1021。鉴于这是一个本地文件,我是否错了期望这是一个正确的值 - 是否存在 available()
会给出错误答案的情况?
编辑:抱歉,还有更多信息。 BufferedInputStream
包裹在 FileInputStream
周围。从 FIS 的源代码来看,我认为我可以安全地依赖 available() 作为本地文件中剩余数据量的衡量标准。我说得对吗?
最佳答案
这个问题毫无意义。这四行代码完全等同于:
reader.read(buffer, 0, 1021);
没有在 available() 调用和读取之间引入的计时窗口问题。请注意,此代码仍然不正确,因为您忽略了返回值,在 EOS 上返回值可以是 -1,也可以是 1 到 1021 之间的任何值。
关于java - 在这种情况下,为 BufferedInputStream 调用 available() 会导致我误入歧途吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5317810/