使用BufferedReader读取所有行

dea*_*els 21 java infinite-loop bufferedreader inputstreamreader

我想使用BufferedReader在控制台中输入多行文本,当我点击"Enter"以查找整个文本长度的总和时.问题是,我似乎进入了一个无限循环,当我按下"Enter"时,程序没有结束.我的代码如下:

InputStreamReader instream = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(instream);

    line= buffer.readLine();

    while (line!=null){
        length = length + line.length();
        line= buffer.readLine();
    }
Run Code Online (Sandbox Code Playgroud)

你能告诉我我做错了什么吗?

Rus*_*ang 66

使用Java 8的一行代码:

line =  buffer.lines().collect(Collectors.joining());
Run Code Online (Sandbox Code Playgroud)

  • 我是否需要包含换行符作为分隔符来保留行? (9认同)
  • 是的,您必须添加一个可能的分隔符来保留行: `buffer.lines() .collect(Collectors.joining(System.lineSeparator()));` (6认同)

Ell*_*sch 28

阅读所有行的惯用方法是while ((line = buffer.readLine()) != null).另外,我建议try-with-resources发表一个声明.就像是

try (InputStreamReader instream = new InputStreamReader(System.in);
        BufferedReader buffer = new BufferedReader(instream)) {
    long length = 0;
    String line;
    while ((line = buffer.readLine()) != null) {
        length += line.length();
    }
    System.out.println("Read length: " + length);
} catch (Exception e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

如果要在收到空行时结束循环,请在while循环中为该循环添加测试

while ((line = buffer.readLine()) != null) {
    if (line.isEmpty()) {
        break;
    }
    length += line.length();
}
Run Code Online (Sandbox Code Playgroud)

JLS-14.15.该break声明说:

一个break语句将控制从一个封闭的声明.

  • 但我认为他希望在他按Enter键时结束. (2认同)

dba*_*ank 5

line当你按回车键时不会为空;它将是一个字符串。

请注意BufferedReaderJavaDoc 的相关内容readLine()

读取一行文本。一行被视为以换行符 ('\n')、回车符 ('\r') 或回车符后紧跟换行符之一终止。

readLine()返回:

包含行内容的字符串,不包括任何行终止字符,如果已到达流末尾,则返回 null

因此,当您按 [Enter] 时,您将给出BufferedReader一个仅包含\n\r或 的新行\r\n。这意味着readLine()将返回一个空字符串。

所以尝试这样的事情:

InputStreamReader instream = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(instream);

line = buffer.readLine();

while( (line != null) && (!line.isEmpty()) ){
    length = length + line.length();
    line = buffer.readLine();
}
Run Code Online (Sandbox Code Playgroud)

  • 我可能错了。但我不认为返回的字符串实际上包含结束行字符。如果确实如此,那么 `System.out.println(buffer.readLine());` 的末尾会有另一行,对吗? (2认同)
  • 另外,在您链接到的 JavaDoc 中:*“返回 [...] 行的内容,不包括任何行终止字符”*。 (2认同)