BufferedReader.readLine() 等待来自控制台的输入。

8

我正在尝试从控制台读取文本行。行数事先未知。BufferedReader.readLine()方法读取一行,但在最后一行之后等待控制台输入。为了避免这种情况,应该怎么做呢?

请参见下面的代码片段:

    public static String[] getLinesFromConsole() {
    String strLine = "";
    try {
        // Get the object of DataInputStream
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        String line = "";
        while ((line = br.readLine()) != null)
            strLine += line + "~"; //edited

        isr.close();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
    return strLine.split("~");
}

1
我的猜测是代码从未退出while循环。而且这样做是正确的。一个想法是,当你读到特定的东西,比如“exit”,你可以跳出循环。 - dkateros
3
那应该是 while ((line = br.readLine()) != null) strLine += line + "~";,正确性不变。 - OldCurmudgeon
你应该使用一些条件来退出 while 循环,例如让用户键入 exit。 - B11
您似乎跳过了每一行的第二行,我怀疑这是不正确的,并且您正在等待输入流的结束,这对大多数控制台用户来说很困难。;) - Peter Lawrey
这是重复的问题。请参考此链接:https://dev59.com/R1XTa4cB1Zd3GeqP48cb - araut
显示剩余3条评论
2个回答

4
以下代码可能可以解决问题,将文本exit替换为您所需的特定字符串。
  public static String[] getLinesFromConsole() {
    String strLine = "";
    try {
        // Get the object of DataInputStream
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        String line = "";
        while ((line = br.readLine()) != null && !line.equals("exit") )
            strLine += br.readLine() + "~";

        isr.close();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
    return strLine.split("~");
}

是否有可能在没有退出字符串的情况下结束readLine执行? - ambar
为了终止文本输入过程,您需要一些“文本”来指示退出或结束。 - TheWhiteRabbit

1
当从控制台读取时,需要定义一个“终止”输入,因为控制台(不像文件)永远不会“结束”(即使在程序终止后仍然运行)。
有几种解决方法:
  1. 将输入放入文件中并使用IO重定向:java ... < input-file shell将把您的进程与输入文件连接起来,您将获得EOF。

  2. 键入控制台的EOF字符。 在Linux和Mac上,它是Ctrl+D,在Windows上,它是Ctrl+Z+Enter

  3. 当您读取空行时停止。 这样,用户只需键入Enter

PS:您的代码中有一个错误。 如果您调用readLine()两次,它将跳过每第二行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接