I have a BufferedReader
(generated by new BufferedReader(new InputStreamReader(process.getInputStream()))
). I'm quite new to the concept of a BufferedReader
but as I see it, it has three states:
- A line is waiting to be read; calling
bufferedReader.readLine
will return this string instantly. - The stream is open, but there is no line waiting to be read; calling
bufferedReader.readLine
will hang the thread until a line becomes available. - The stream is closed; calling
bufferedReader.readLine
will return null.
Now I want to determine the state of the BufferedReader
, so that I can determine whether I can safely read from it without hanging my application. The underlying process (see above) is notoriously unreliable and so might have hung; in this case, I don't want my host application to hang. Therefore I'm implementing a kind of timeout. I tried to do this first with threading but it got horribly complicated.
Calling BufferedReader.ready()
will not distinguish between cases (2) and (3) above. In other words, if ready()
returns false, it might be that the stream just closed (in other words, my underlying process closed gracefully) or it might be that the underlying process hung.
So my question is: how do I determine which of these three states my BufferedReader
is in without actually calling readLine
? Unfortunately I can't just call readLine
to check this, as it opens my app up to a hang.
I am using JDK version 1.5.