Can calling available() for a BufferedInputStream lead me astray in this case?
I am reading in arbitrary size file in blocks of 1021 bytes, with a block size of <= 1021 bytes for the final block of the file. At the moment, I am doing this using a BufferedInputStream
which is wrapped around a FileInputStream
and code that looks (roughly) like the following (where reader
is the BufferedInputStream
and this is operating in a loop):
int availableData = reader.available();
int datalen = (availableData >= 1021)
? 1021
: availableData;
reader.read(bufferArray, 0, datalen);
However, from reading the API docs, I note that available()
only gives an "estimate" of the available size, before the call would 'block'. Printing out the value of availableData
each iteration seems to give the expected values - starting with the file size and slowly getting less until it is <= 1021. Given that this is a local file, am I wrong to expect this to be a correct value - is there a situation where available()
would 开发者_开发技巧give an incorrect answer?
EDIT: Sorry, additional information. The BufferedInputStream
is wrapped around a FileInputStream
. From the source code for a FIS, I think I'm safe to rely on available() as a measure of how much data is left in the case of a local file. Am I right?
The question is pointless. Those four lines of code are entirely equivalent to this:
reader.read(buffer, 0, 1021);
without the timing-window problem you have introduced between the available() call and the read. Note that this code is still incorrect as you are ignoring the return value, which can be -1 at EOS, or else anything between 1 and 1021 inclusive.
It doesn't give the estimated size, it gives the remaining bytes that can be read. It's not an estimate with BufferedInputStream
.
Returns the number of bytes that can be read from this input stream without blocking.
You should pass available()
directly into the read()
call if you want to avoid blocking, but remember to return if the return value is 0 or -1. available()
might throw an exception on buffer types that don't support the operation.
精彩评论