我没有得到我期望在Java中使用readLine()的结果

时间:2020-03-05 18:42:35  来源:igfitidea点击:

我正在使用下面的代码段,但是按我的理解,它不能正常工作。

public static void main(String[] args) {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String line;
    try {
        line = br.readLine();
        while(line != null) {
            System.out.println(line);
            line = br.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

阅读有关readLine()的Javadoc时,它说:

读取一行文本。一行被认为由换行符(\ n),回车符(\ r)或者回车符后立即换行符中的任何一个终止。

返回值:
一个包含行内容的"字符串",不包含任何行终止符;如果已到达流的末尾,则为null

抛出:
IOException如果发生I / O错误

根据我的理解,readLine应该在第一次输入除行终止以外的任何输入时返回null,例如\ r。但是,此代码最终会无限循环。调试之后,我发现当只输入一个终止符时,返回的不是空值,而是实际上返回了一个空字符串("")。这对我来说没有意义。我没有正确理解什么?

解决方案

回答

没有输入与流的末尾不同。通常,我们可以在控制台中按Ctrl + D来模拟流的结尾(AFAIK某些系统使用Ctrl + Z代替)。但是我想这不是我们想要的,因此除了空字符串之外,还要对空字符串进行更好的测试。

回答

From my understanding of this, readLine should return null the first time no input is entered other than a line termination, like '\r'.

那是不对的。如果到达流的末尾,则readLine将返回null。也就是说,例如,如果我们正在读取文件,并且文件结束了,或者我们正在从套接字读取并且套接字关闭。

但是,如果我们只是在读取控制台输入,则敲击键盘上的Return键并不意味着流结束。它只是返回的一个字符(根据操作系统,为" \ n"或者" \ r \ n")。

因此,如果我们想同时中断空字符串和行尾,则应该执行以下操作:

while (line != null && !line.equals(""))

另外,如果我们直接将某些文件通过管道传输到它,则当前程序应能按预期工作,如下所示:

java -cp . Echo < test.txt

回答

有一个不错的apache commons lang库,其中有一个很好的common :)操作的api。我们可以使用静态导入StringUtils并使用其方法isNotEmpty(String)获得:

while(isNotEmpty(line)) {
    System.out.println(line);
    line = br.readLine();
}

也许有一天会有用:)这个库中还有其他有用的类。