Java 使用BufferedReader读取所有行

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();

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

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

在按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编辑为add
break
。这确实有效,但出于某种原因,我必须按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”))。否则,我很好奇为什么会被否决:我的代码与其他代码类似(当我