38

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

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

4

8 回答 8

97

使用 Java 8 的一行代码:

line =  buffer.lines().collect(Collectors.joining());
于 2016-11-03T23:30:42.623 回答
40

阅读所有行的惯用方式是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控制权转移到封闭语句之外。

于 2015-03-11T02:11:26.863 回答
4

line按回车时不会为空;这将是一个字符串。

请注意BufferedReaderJavaDoc所说的内容readLine()

读取一行文本。一行被认为是由换行符 ('\n')、回车符 ('\r') 或紧跟换行符的回车符中的任何一个终止的。

readLine()返回:

包含行内容的字符串,不包括任何行终止字符,如果已到达流的末尾,则为 null

因此,当您按 [Enter] 时,您将给出一个仅包含、或BufferedReader的新行。这意味着将返回一个空字符串。\n\r\r\nreadLine()

所以尝试这样的事情:

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();
}
于 2015-03-11T02:04:50.620 回答
4

当您仅按 Enter 时,返回 frombuffer.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();
}

这应该可以解决您的问题。希望这有帮助!:)

于 2015-03-11T02:20:08.530 回答
2

从 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();
    }
于 2016-06-29T13:48:29.757 回答
0

刻薄的回答:你做错的只是在 Java 中创建 2 个对象来做某事......如果你搜索,你可能会找到更多扩展 BufferedReader 或 ExtendedBufferReader 等的类,然后它可以是真正的 Enterprise Java .

现在我已经从我的系统中得到了这个:更有用的答案。输入EOF时System.in关闭,Linux下是Control-D,我想MacOS,Windows下我想是Control-Z加回车。如果你想检查输入(或者更具体地说,两个输入......一个完成最后一行,一个表示你已经完成,这本质上是 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();
    }
于 2015-03-11T02:11:13.407 回答
0

@Russel Yang 的好例子(https://stackoverflow.com/a/40412945/11079418)。

使用此代码,在每行之后添加一个换行符。

String lines = bufferedReader.lines().map(line -> line + "\n").collect(Collectors.joining());
于 2021-01-21T07:37:33.243 回答
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;
}
于 2018-11-21T05:41:23.577 回答