使用BufferedReader读取所有行

我想使用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(); } 

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

读取所有行的惯用方法是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(); } 

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

 while ((line = buffer.readLine()) != null) { if (line.isEmpty()) { break; } length += line.length(); } 

JLS-14.15。 break声明说

break语句将控制转移到封闭语句之外。

使用Java 8的一行代码:

 line = buffer.lines().collect(Collectors.joining()); 

当你只按回车从buffer.readLine(); 不为null它是一个空字符串。

因此你应该将line != null更改为!line.equals("") (你也可以将它改为line.length() > 0

现在你的代码看起来像这样:

 InputStreamReader instream = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(instream); line = buffer.readLine(); while (!line.equals("")){ length = length + line.length(); line = buffer.readLine(); } 

这应该可以解决您的问题。 希望这有帮助! 🙂

按Enter键时, line不会为空; 它将是一个字符串。

记下BufferedReader JavaDoc关于readLine()

读一行文字。 一条线被认为是由换行符(’\ n’),回车符(’\ r’)或回车符中的任何一个终止,后面紧跟换行符。

readLine()返回:

包含行内容的String,不包括任何行终止字符;如果已到达流的末尾,则为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(); } 

Snarky回答:你所做错的只是在Java中创建2个对象来做某事……如果你搜索,你可能会找到一些扩展BufferedReader或ExtendedBufferReader等的类,然后它可以是真正的Enterprise Java 。

现在我已经从我的系统中得到了这个:更有用的答案。 输入EOF时,System.in关闭,这是Linux下的Control-D,我认为MacOS,我认为 Control-Z plus在Windows下输入。 如果你想检查输入(或者更具体地说,两个输入…一个完成最后一行,一个输入表示你已经完成,这实际上是http如何处理确定http标头何时完成以及它的时间http主体,然后@dbank的解决方案应该是一个可行的选项,我将尝试在while谓词内移动!而不是!while。

(编辑#2:实现的readLine剥离换行符,所以空行将“”而不是换行符,所以现在我的代码转换为另一个答案,EOF位作为答案而不是注释)

编辑……这很奇怪,@ dbank在我输入答案时已经回答了,如果我没有提到EOF替代品,我会停止。 要使用我要进行的编辑从内存中重复他的代码:

 InputStreamReader instream = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(instream); line= buffer.readLine(); while (line != null && !line.equals("")){ length = length + line.length(); line= buffer.readLine(); } 

从Java 8开始,您可以直接在缓冲读卡器上使用BufferedReader#lines方法。

  try (InputStreamReader in = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(in)) { final int length = buffer.lines().mapToInt(String::length).sum(); System.out.println("Read length: " + length); } catch (Exception e) { e.printStackTrace(); }