According to the Java api documentation, the read()
method that is declared in InputStream
is described as:
If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.
I have a while(true)
loop doing a read()
and I always get -1 when nothing's sent over the stream. That's expected.
My question is when would read()
ever block? Since if it doesn't get any data it returns -1. I would expect a blocking read()
to wait until data is received. If you've reached the end of the input stream, shouldn't read()
simply wait for data instead of returning -1?
Or does read()
only block if there's another thread accessing the stream and your read()
cannot access the stream?
Which leads me to my next question. I used to have event listener (provided by my library) that would notify me when data is available. When I was notified I would start while((aByte = read()) > -1)
cycle to store the byte. I was puzzled when I'd get TWO events in very short time and not all my data was being displayed. It seemed like only the tail end of the second event's data would be displayed and the the rest was missing.
I eventually changed my code so that when I get an event I'd started if(inputStream.available() > 0) while((aByte = read()) > -1)
to store the byte. Now it worked properly and all my data was displayed.
Can someone explain this behavior? The available()
method of InputStream
is said to return the number of bytes you can read before blocking the next caller (of the stream?). Even if I don't use available()
I would expect the read of the first event to just block the read of the second event, but not erase or consume too much stream data. Why would doing this cause not all of my data to be displayed?