我想使用BufferedReader在控制台中键入多行文本,当我点击"输入"找到整个文本长度的总和。问题是我似乎进入了一个无限循环,当我按下" 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();
}
你能告诉我我做错了什么吗?
答案 0 :(得分:55)
使用Java 8的一行代码:
^
答案 1 :(得分:24)
阅读所有行的惯用方法是while ((line = buffer.readLine()) != null)
。另外,我建议try-with-resources
statement。像
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. The break
Statement说
break
语句将控制权移出封闭语句。
答案 2 :(得分:4)
当您只按Enter键时,buffer.readLine();
的返回值不为空,则为空字符串。
因此,您应该将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();
}
这应该可以解决您的问题。希望这有帮助! :)
答案 3 :(得分:3)
line
不会为空;它将是一个空字符串。
请注意BufferedReader
JavaDoc对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();
}
答案 4 :(得分:0)
Snarky回答:你做错了只是用Java创建2个对象来做某事......如果你搜索,你可以找到一些扩展BufferedReader或ExtendedBufferReader等的类,然后它可以是真正的Enterprise Java。
现在我已经从我的系统中得到了这个:更有用的答案。当您输入EOF时,System.in将关闭,这是Linux下的Control-D,我认为是MacOS,而我认为 Control-Z plus在Windows下输入。如果你想检查输入(或者更具体地说,两个输入...一个完成最后一行,一个输入表示你已经完成,这实际上是http处理如何确定何时完成http标题和它&&对于http机构的时间,那么@dbank的解决方案应该是一个可行的选择,只需要一个小修复,我将尝试移动!在while谓词内而不是!
(编辑#2:已实现readLine剥离换行符,因此空行将#34;"而不是换行符,所以现在我的代码转换为另一个答案,将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();
}
答案 5 :(得分:0)
从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();
}
答案 6 :(得分:0)
将每行放入String []数组。第二种方法获取文本文件中包含的行数。我希望这对任何人都可能有用。
public static void main(String... args) throws IOException {
String[] data = getLines();
for(String v : data) {
out.println(v);
}
}
public static String[] getLines() throws IOException {
BufferedReader bufferReader = new BufferedReader(new FileReader("C:\\testing.txt"));
String line = bufferReader.readLine();
String[] data = new String[getLinesLength()];
int i = 0;
while(line != null) {
data[i] = line;
line = bufferReader.readLine();
i++;
}
bufferReader.close();
return data;
}
public static int getLinesLength() throws IOException {
BufferedReader bufferReader = new BufferedReader(new FileReader("C:\\testing.txt"));
String line = bufferReader.readLine();
int size = 0;
while(line != null) {
size += 1;
line = bufferReader.readLine();
}
bufferReader.close();
return size;
}
答案 7 :(得分:0)
@Russel Yang (https://stackoverflow.com/a/40412945/11079418) 的好例子。
使用此代码,在每行之后添加一个新行字符。
String lines = bufferedReader.lines().map(line -> line + "\n").collect(Collectors.joining());