我正在读取1021字节块的任意大小的文件,其中文件的最后一块的块大小BufferedInputStream进行此操作,该FileInputStream包裹在reader周围,代码看起来(大致)如下所示(其中BufferedInputStreamavailable(),并且在循环中运行):

int availableData = reader.available();
int datalen = (availableData >= 1021)
                ? 1021
                : availableData;
reader.read(bufferArray, 0, datalen);


但是,通过阅读API文档,我注意到availableData仅在调用“阻塞”之前给出可用大小的“估计”。每次迭代打印出available()的值似乎都可以得到预期的值-从文件大小开始,逐渐减小直到BufferedInputStream给出错误答案的情况?

编辑:对不起,其他信息。 FileInputStream包裹在周围。从FIS的源代码中,我认为可以安全地使用available()来衡量在本地文件情况下还剩下多少数据。我对吗?

最佳答案

这个问题毫无意义。这四行代码完全等效于此:

reader.read(buffer, 0, 1021);


不会在您在available()调用和read之间引入定时窗口问题。请注意,此代码仍然不正确,因为您忽略了返回值,在EOS处返回值可以为-1,否则为1到1021之间的任何值。

10-08 02:54