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

时间:2011-03-15 20:44:30

标签: java fileinputstream bufferedinputstream

我正在以1021字节的块读取任意大小的文件,对于文件的最后一块,块大小为< = 1021字节。目前,我使用围绕BufferedInputStream的{​​{1}}和看起来(大致)类似于以下内容的代码执行此操作(其中FileInputStreamreader并且这是在一个循环中运行):

BufferedInputStream

但是,通过阅读API文档,我注意到int availableData = reader.available(); int datalen = (availableData >= 1021) ? 1021 : availableData; reader.read(bufferArray, 0, datalen); 仅在调用“阻止”之前给出了可用大小的“估计”。打印出available()每次迭代的值似乎给出了预期的值 - 从文件大小开始慢慢变小,直到它是< = 1021.鉴于这是一个本地文件,我错了预料到这一点是一个正确的价值 - 是否有availableData给出错误答案的情况?

编辑:抱歉,其他信息。 available()围绕BufferedInputStream。从FIS的源代码来看,我认为我可以安全地依赖available()来衡量本地文件中剩余的数据量。我是对的吗?

2 个答案:

答案 0 :(得分:2)

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

reader.read(buffer, 0, 1021);

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

答案 1 :(得分:1)

它没有给出估计的大小,它给出了可以读取的剩余字节。这不是BufferedInputStream的估算值。

  

返回可以的字节数   无需读取此输入流   阻塞。

如果您想避免阻止,则应将available()直接传递到read()调用,但如果返回值为0或-1,请记得返回。 available()可能会对不支持该操作的缓冲区类型抛出异常。