This is a bit of an obscure problem that only seems to happen when I’m on certain computers.
I was having this issue today on our school’s XP computers and I can’t seem to replicate this on my home computer (W7).
Anyway, reading/writing to sockets in Java tends to be problematic whenever I use this code (where: int avail, InputStream socket, byte[] buffer, String output):
while( (avail = input.available()) > 0 )
{
read = input.read( buffer );
output += new String( buffer, 0, read );
}
It seems to make sense (reading all the data until no data is available to a temporary buffer, then to a string), but on our school computers (testing it using IE7), the whole thing somehow pauses. I’m thinking input.available() is causing it to somehow block because the thread just keeps running without ever reaching an endpoint… effectively just pausing somewhere.
OH, I forgot to mention: whenever I run this in debug mode and perform each line step-by-step, it works completely like it should… which just confuses me even more.
When I got home to replicate this issue, it works just fine (just using Firefox and IE8). I have no idea what would be a better alternative to this.
PS:
If the buffer is large enough and I just use:
read = input.read( buffer );
output += new String( buffer, 0, read );
It works just fine, but there’s always a worry that the data sent will exceed the buffer size.
You’re thinking about
available()the wrong way. That method tells you approximately how many bytes can be read right now, without blocking. The commonly accepted idiom for what you’re trying to do isor something along those lines (not compiled/tested).
Update: I think you misunderstand the concept of “end of the stream”. “End of the stream” doesn’t mean that all the data you want to read has been read. It means that there isn’t, and won’t ever be, anything else to read. For instance, it might mean that you were reading a file and have come to the end of it, or it might mean you were reading from an in-memory byte array and came to the end of that. Those are “end of streams”.
In your question, you indicated, or at least implied, that you’re reading from a Socket. Are you aware that you’ll never get to the end of that stream until the associated Socket or the remote end of the connection is closed? Just because you received a bit of data from it doesn’t make it the end of the stream.