2008-08-24 80 views
4

我正在使用下面的代码片段,但它不工作,因为我理解它应该。我没有得到结果我期待在Java中使用readLine()

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(); 
    } 
} 

从阅读有关的Javadoc它readLine()说:

读取一行文本。换行(\n),回车(\r)或回车后立即换行。

返回: 包含该行的内容,不包括任何行终止符,或A String NULL,如果流的末尾已到达

抛出IOException - 如果发生I/O错误

从我对此的理解中,readLine应该在第一次输入时不返回输入,除了行终止之外,如\r。但是,这段代码只是无限循环而已。调试完成后,我发现在输入终止字符时不会返回null,而是实际返回一个空字符串(“”)。这对我没有意义。我不正确的理解是什么?

回答

10

根据我对此的理解,readLine应该在第一次输入时不输入输入,而不是行终止,如'\ r'。

这是不正确的。如果到达流的末尾,则readLine将返回null。例如,如果您正在读取文件,文件结束,或者您正在从套接字读取并且套接字关闭。

但是,如果您只是阅读控制台输入,则按下键盘上的返回键并不构成流的结束。它只是一个返回的字符(\n\r\n,具体取决于您的操作系统)。

所以,如果你想在这两个空字符串和线的末端突破,你应该做的:

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

而且,当前的程序应该按预期工作,如果你直接管了一些文件到它,像这样:

java -cp . Echo < test.txt 
+0

readLine()返回行加行换字符 - '\ n'或只是行? – Ashwin 2012-05-18 11:33:44

3

没有输入与流结束不一样。通常,可以通过按下Ctrl键+d模拟在控制台中的流的末尾(AFAIK一些系统使用Ctrl键 + Ž代替)。但我想这不是你想要的,所以更好地测试空字符串以外的空字符串。

1

有一个不错的apache commons lang库,它有一个很好的常见的动作api。你可以使用静态导入StringUtils的和使用它的方法isNotEmpty(字符串),以获得:

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

这可能是有益的一天:)也有这个lib中其他有用的类。