Advertisement
Advertisement


I Am Not Getting the Result I Expect Using readLine() in Java


Question

I am using the code snippet below, however it's not working quite as I understand it should.

public static void main(String[] args) {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String line;
    try {
        line = br.readLine();
        while(line != null) {
            System.out.println(line);
            line = br.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

From reading the Javadoc about readLine() it says:

Reads a line of text. A line is considered to be terminated by any one of a line feed (\n), a carriage return (\r), or a carriage return followed immediately by a linefeed.

Returns: A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached

Throws: IOException - If an I/O error occurs

From my understanding of this, readLine should return null the first time no input is entered other than a line termination, like \r. However, this code just ends up looping infinitely. After debugging, I have found that instead of null being returned when just a termination character is entered, it actually returns an empty string (""). This doesn't make sense to me. What am I not understanding correctly?

2012/04/25
1
5
4/25/2012 11:10:28 PM

Accepted Answer

From my understanding of this, readLine should return null the first time no input is entered other than a line termination, like '\r'.

That is not correct. readLine will return null if the end of the stream is reached. That is, for example, if you are reading a file, and the file ends, or if you're reading from a socket and the socket closses.

But if you're simply reading the console input, hitting the return key on your keyboard does not constitute an end of stream. It's simply a character that is returned (\n or \r\n depending on your OS).

So, if you want to break on both the empty string and the end of line, you should do:

while (line != null && !line.equals(""))

Also, your current program should work as expected if you pipe some file directly into it, like so:

java -cp . Echo < test.txt
2008/08/24
10
8/24/2008 3:00:43 PM


There's a nice apache commons lang library which has a good api for common :) actions. You could use statically import StringUtils and use its method isNotEmpty(String ) to get:

while(isNotEmpty(line)) {
    System.out.println(line);
    line = br.readLine();
}

It might be useful someday:) There are also other useful classes in this lib.

2008/08/30

Source: https://stackoverflow.com/questions/25033
Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Email: [email protected]