0

我正在以 1021 字节的块读取任意大小的文件,文件的最后一个块的块大小为 <= 1021 字节。目前,我正在使用一个BufferedInputStream包裹在 a 周围的 aFileInputStream和看起来(大致)如下所示的代码(在哪里reader并且BufferedInputStreamthis 在循环中运行):

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

但是,通过阅读 API 文档,我注意到available()在调用“阻塞”之前只给出了可用大小的“估计”。打印出availableData每次迭代的值似乎给出了预期值 - 从文件大小开始,慢慢变小,直到它 <= 1021。鉴于这是一个本地文件,我认为这是一个正确的值是错误的 -有没有available()会给出错误答案的情况?

编辑:对不起,附加信息。被BufferedInputStream包裹在一个FileInputStream. 从 FIS 的源代码来看,我认为我可以安全地依赖 available() 作为在本地文件的情况下剩余多少数据的度量。我对吗?

4

2 回答 2

2

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

reader.read(buffer, 0, 1021);

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

于 2011-03-16T00:46:03.607 回答
1

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

返回可以不阻塞地从此输入流中读取的字节数。

如果你想避免阻塞,你应该available()直接传入read()调用,但如果返回值为 0 或 -1,请记住返回。available()可能会在不支持该操作的缓冲区类型上引发异常。

于 2011-03-15T20:53:19.987 回答