使用BufferedReader读取所有行

时间:2015-03-11 01:58:25

标签: java bufferedreader infinite-loop inputstreamreader

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

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

8 个答案:

答案 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)

按Enter键时,

line不会为空;它将是一个字符串。

请注意BufferedReader JavaDocreadLine()所说的内容:

  

读取一行文字。一条线被认为是换行(' \ 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());