Java 使用BufferedReader读取所有行
我想使用BufferedReader在控制台中键入一个多行文本,当我点击“Enter”以查找整个文本的长度总和时。问题是,我似乎进入了一个无限循环,当我按下“回车”键时,程序并没有结束。我的代码如下:Java 使用BufferedReader读取所有行,java,bufferedreader,infinite-loop,inputstreamreader,Java,Bufferedreader,Infinite Loop,Inputstreamreader,我想使用BufferedReader在控制台中键入一个多行文本,当我点击“Enter”以查找整个文本的长度总和时。问题是,我似乎进入了一个无限循环,当我按下“回车”键时,程序并没有结束。我的代码如下: InputStreamReader instream = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(instream); line= buffer.readLine();
InputStreamReader instream = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(instream);
line= buffer.readLine();
while (line!=null){
length = length + line.length();
line= buffer.readLine();
}
你能告诉我我做错了什么吗?
行
在按enter键时不会为空;它将是一个空字符串
请注意关于readLine()
的说明:
读一行文字。一行被认为是由换行符('\n')、回车符('\r')或紧接着换行符的回车符中的任意一个终止的
和readLine()
返回:
包含行内容的字符串,不包括任何行终止字符,如果已到达流的结尾,则为null
因此,当您按[Enter]键时,您将给缓冲读取器
一个新行,其中只包含\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();
}
尖刻的回答:你做错的只是在Java中创建两个对象来做一些事情。。。如果您进行搜索,您可能会找到更多扩展BufferedReader或ExtendedBufferReader等的类,然后它可能是真正的企业Java 现在我已经从我的系统中得到了:更有用的答案。当您输入EOF时,System.in是关闭的,在Linux下是Control-D,我认为是MacOS,在Windows下是Control-Z+enter。如果要检查是否输入(或者更具体地说,两个输入…一个输入完成最后一行,一个输入指示完成,这基本上是http处理确定http头何时完成以及http正文时间的方式,那么@dbank的解决方案应该是一个可行的选项,我将尝试在while predi中进行一个小的修复,以移动用美食代替!而不是 (编辑#2:realized 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();
}
读取所有行的惯用方法是
while((line=buffer.readLine())!=null)
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();
}
说
break
语句将控制权从封闭语句中转移出来
仅按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();
}
这应该可以解决您的问题。希望这有帮助!:)因为Java 8可以直接在缓冲读取器上使用该方法
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();
}
使用Java 8的一行代码:
line = buffer.lines().collect(Collectors.joining());
将每一行放入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;
}
来自@Russel Yang()的好例子 使用此代码,还可以在每行后面添加一个新行字符
String lines = bufferedReader.lines().map(line -> line + "\n").collect(Collectors.joining());
当您只按enter键时,
line
将等于“”而不是null。尝试将line!=null
更改为!line.equals(“”)
,仅提供一些其他意见(例如使用for循环),昨晚我睡着时意识到:你在用长度做什么?注意,如果你在你的程序中使用cat myfile | java并打印出长度值,这将与wc打印出的值不一致,因为你没有计算换行符。如果你需要这样做,请注意DOS文件将有“\r\n”,UNIX文件将有“\r\n”“\n”和我最初使用System.getProperty(“line.separator”)的建议可能不起作用,因为无法保证您不会在Linux下读取DOS文件(因此,希望您不打算这样做)因为OP是从系统中读取的。在中,这不会永远不会结束吗?它不会只是等待用户下一次输入吗?@StephenB它将在EOF(或ctrl-d)上结束;也可能是ctrl-c和/或ctrl-brk。但我想他希望在按Enter键时结束。它并不是以Enter键结束。它确实是:/@deadpixels编辑为addbreak
。这确实有效,但出于某种原因,我必须按Enter键两次。知道为什么吗?@deadpixels当我运行程序时,它会在第一个空行终止。是否按Enter键时计数器上升?我可能错了。但我认为返回的字符串实际上不包含结束行字符。如果它包含结束行字符,则System.out.println(buffer.readLine());
会在右端有另一行?同样在您链接到的JavaDoc中:“returns[…]行的内容,不包括任何行终止字符。“@StephenB和@RadioDef:啊,我的错误!你们都是对的。我被read()
搞混了,谁知道是什么。而删除之前的(!line.isEmpty()){…}
是正确的。。。(除了一些人指出,如果用户做了不清楚的事情,readLine
仍然可以返回null之外。)我编辑以更正我的答案。@StephenB和RadioDef,感谢你们两位给我打电话并更正我的错误,这样我就不会传播错误信息了。给下一位投票人:如果这是因为顶部的刺耳回答,那么请使用byte me(我的意思是,新的byte[](“me”.getBytes(Charset.forName)(“UTF-8”))。否则,我很好奇为什么会被否决:我的代码与其他代码类似(当我