我正在使用下面的代码片段,但它并不像我理解的那样工作。

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 )或回车符中的任何一个终止,后面紧跟换行符。

返回 :包含行内容的String ,不包括任何行终止字符;如果已到达流的末尾,则返回null

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

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

===============>>#1 票数:10 已采纳

根据我对此的理解,readLine应该在第一次没有输入输入时返回null,而不是行终止,比如'\\ r'。

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

但是,如果您只是阅读控制台输入,则按键盘上的返回键不会构成流的结束。 它只是一个返回的字符( \\n\\r\\n取决于您的操作系统)。

所以,如果你想打破空字符串和行尾,你应该这样做:

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

此外,如果您将一些文件直接输入其中,您当前的程序应该按预期工作,如下所示:

java -cp . Echo < test.txt

===============>>#2 票数:3

没有输入与流的结尾不同。 您通常可以通过按Ctrl + D模拟控制台中的流结束(AFAIK某些系统使用Ctrl + Z代替)。 但我想这不是你想要的,所以更好的测试空字符串除了空字符串。

===============>>#3 票数:1

有一个很好的apache commons lang库,它有很好的api for common :)动作。 您可以使用静态导入StringUtils并使用其方法isNotEmpty(String)来获取:

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

它有一天可能会有用:)这个库中还有其他有用的类。

  ask by Aaron translate from so

未解决问题?本站智能推荐:

1回复

java bufferedreader,声明readline

我正在实现一个Socket,它将接受来自服务器的数据。 服务器将发送数据记录,该记录将由stx,data,etx分隔。 我的问题是,如果我使用以下代码: 会自动将每个数据记录分开吗? 还是我必须自己做? 谢谢 STX =文本开始(ASCII字符) ETX =文本结尾(
1回复

Java readLine()无法正常工作

我正在编写一个从文本文件中读取翻译内容的翻译程序。 此方法从文本文件读取,并将其添加到我用于词典的Map对象。 但是,每当我运行它时,它都将打印此内容,而不是打印文本文件中的单词。 文本文件仅列出了英语和法语的前十个字母,因此输出应类似于: 我该如何解决?
1回复

Java BufferedReader readLine方法不返回任何内容

我有一个要解决的问题: http : //www.urionlinejudge.com.br/judge/problems/view/1117 对于我的代码,当代码到达最后一行时,方法readLine不返回任何内容。 它等待我输入另一行输入。
2回复

我的Java代码经常陷入“ while((line = rd.readLine())!= null){”循环中。 如何优化代码

我的Java代码经常陷入循环“ while((line = rd.readLine())!= null){” 我猜这是因为Java垃圾回收没有收回一些内存。 变量“ line”将在每次迭代中指向新内容,并且由于某些原因,java GC不会回收“ line”的旧内容的内存。 那么如何
1回复

在Java中使用对象(实体)

我是java的新手,我已经开发了一个程序,该程序允许用户输入其输入和结果,还可以看到两者的摘要(第二个代码示例)。 我使用文本文件存储数据(第一个示例)。 我为每个用户使用两个文本文件,一个用于收入,一个用于结果。 以下代码示例总结了用户的信息和结果(注意:opnEsoda是扫描
1回复

为什么在java中使用java.security.SecurityManager可以读取任何文件?

我只想在我的Java程序中读取和写入一些文件。 所以我使用java.security.SecurityManager来管理它,但似乎并不令人满意。 Main.java文件如下 和文件/opt/java.policy如下 然后我跑了 但是没有错误,输出就是in.tx
1回复

如果服务器响应超时,将Java File.delete()与UNC路径一起使用会得到什么

我有一个理论上的问题要问你。 如果使用UNC路径(即new File(“ \\ 192.168.10.10 \\ MyShare \\ myFile.txt”)。delete()且基础SMB_COM_DELETE请求到达SMB服务器)调用java.io.File#delete()会发生什么
2回复

readLine()无法正常工作

我有readLine()的问题,即我的系统不接受我的任何输入请求,它直接执行下一行我的代码中的错误是什么我的代码是: 此代码仅在netbeans命令模式下工作,它无法访问谢谢
1回复

继续通过readLine()获得此异常

因此,我尝试使用BufferedReader编写一个循环,该循环读取下一行,将该行转换为双精度,然后将其添加到总和中。 这将继续到文件末尾。 由于某种原因,我不断收到此错误, 这是我的代码:
4回复

套接字:BufferedReader readLine()块

我使用BufferedReader.readLine()方法从远程服务器读取响应(用C编写,我无法访问源代码)。 但它总是在最后一行阻塞,直到它超时。 所以我使用了以下代码: 我发现读取的最后一个字节的整数值为13,我认为这是一个回车,对吧? 那么为什么readLine方