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.readLinewill return this string instantly. - The stream is open, but there is no line waiting to be read; calling
bufferedReader.readLinewill hang the thread until a line becomes available. - The stream is closed; calling
bufferedReader.readLinewill 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.
Finally I found a solution to this. Most of the answers here rely on threads, but as I specified earlier, I am looking for a solution which doesn’t require threads. However, my basis was the process. What I found was that processes seem to exit if both the output (called “input”) and error streams are empty and closed. This makes sense if you think about it.
So I just polled the output and error streams and also tried to determine if the process had exited or not. Below is a rough copy of my solution.