我没有得到我期望在Java中使用readLine()的结果
我正在使用下面的代码段,但是按我的理解,它不能正常工作。
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(); }
也许有一天会有用:)这个库中还有其他有用的类。