我正在以1021字节的块读取任意大小的文件,对于文件的最后一块,块大小为< = 1021字节。目前,我使用围绕BufferedInputStream
的{{1}}和看起来(大致)类似于以下内容的代码执行此操作(其中FileInputStream
是reader
并且这是在一个循环中运行):
BufferedInputStream
但是,通过阅读API文档,我注意到int availableData = reader.available();
int datalen = (availableData >= 1021)
? 1021
: availableData;
reader.read(bufferArray, 0, datalen);
仅在调用“阻止”之前给出了可用大小的“估计”。打印出available()
每次迭代的值似乎给出了预期的值 - 从文件大小开始慢慢变小,直到它是< = 1021.鉴于这是一个本地文件,我错了预料到这一点是一个正确的价值 - 是否有availableData
给出错误答案的情况?
编辑:抱歉,其他信息。 available()
围绕BufferedInputStream
。从FIS的源代码来看,我认为我可以安全地依赖available()来衡量本地文件中剩余的数据量。我是对的吗?
答案 0 :(得分:2)
这个问题毫无意义。这四行代码完全等同于:
reader.read(buffer, 0, 1021);
没有在available()调用和read之间引入的时间窗问题。请注意,此代码仍然不正确,因为您忽略了返回值,在EOS处可以为-1,或者包含1到1021之间的任何值。
答案 1 :(得分:1)
它没有给出估计的大小,它给出了可以读取的剩余字节。这不是BufferedInputStream
的估算值。
返回可以的字节数 无需读取此输入流 阻塞。
如果您想避免阻止,则应将available()
直接传递到read()
调用,但如果返回值为0或-1,请记得返回。 available()
可能会对不支持该操作的缓冲区类型抛出异常。