java - 在这种情况下,为 BufferedInputStream 调用 available() 会导致我误入歧途吗?

标签 java fileinputstream bufferedinputstream

我正在以 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/

相关文章:

java - 将用户组分配给角色 - Liferay 6.1.1

java - IntelliJ IDEA 不在构建时复制资源

java - Apache netbeans IDE 10.0 安装了 JEE 支持,但注释仍然错误

Java:多个线程同时读取同一个InputStream

java - 使用 BufferedOutputStream 创建大文件需要很长时间

java - 在 SOAP 服务项目内创建文件

java - 如何使用字节数组作为参数构建 FileInputStream 对象

java - 如何将通用文件发送到 Jersey 服务并正确接收?

java - 当我关闭 BufferedInputStream 时,底层的 InputStream 是否也关闭了?

java - 文件未从某些 HTTP URL 下载