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