BufferedReader, detecting if there is text left to read
Asked Answered
S

3

5

I'm running a thread and everytime it runs, It should be checking to see if there is a new line to read from the BufferedReader although, it gets stuck waiting for a line to exist, thus halting the entire code.

if((inputLine = bufferedReader.readLine()) != null){
                System.out.println(inputLine);
                JOptionPane.showMessageDialog(null, inputLine);
}

Is there a way to better check if there is text in a BufferedReader to be read?

Solita answered 28/11, 2012 at 1:9 Comment(4)
Why? It will block if there's no data. What else are you going to do instead?Ovid
Have you tried BufferedReader#ready() docs.oracle.com/javase/6/docs/api/java/io/…?Hoebart
I don't think that ready() would answer that need. ready() would tell him whether there's something in the buffer; it won't tell him whether there's a full line to read. readLine() will still enter a waiting state, won't it?Domesday
ready fixed it, thanks guysSolita
S
5

No, there's no easy way to do that. BufferedReader has a ready call, but that only applies to the read calls, not the readLine call. If you really want a readLine that's guaranteed not to block, you must implement it yourself using read and maintaining a char buffer yourself.

Sharper answered 28/11, 2012 at 1:15 Comment(1)
so if I do ready() that will skip over it if there is no text in there? the readlLine was just so I could use spaces.Solita
D
2

Why don't you check if it's ready to be read first? Just use bufferedReader.ready().

Edit:

ready won't tell you if you have a line ready, it will just tell you that there is something to be read. However, if you are expecting to get a line then this will work for you. The idea would be, first check if it's ready, and then read the line, in this way the thread won't be hanging there when there is absolutely nothing to read.

Drill answered 28/11, 2012 at 1:23 Comment(2)
ready() will return true but readLine() might still block, if the buffer contains characters none of which is a line terminator.Domesday
It's not reliable in general (allowed to give false negatives), and in any case, only checks that there's at least one character available, not a full line.Blotto
D
0

The readLine method will block unless it can read an entire line (delimited by a line-terminating character), or the end of input has been reached:

http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#readLine()

The case you're describing is that the end of input hasn't yet been reached, but there's not enough characters in the buffer to constitute a "line" (that is, a series of characters ended by a line terminator).

You will have to go lower than the readLine level for that, possibly to the Stream level itself. InputStream has a method called available(), which would answer your needs.

Domesday answered 28/11, 2012 at 1:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.