Java 中的标准输入为空

Null in standard input in Java

我正在开发一个小程序,用户可以在其中输入标准输入的文本,然后 return 以正确的对齐方式编辑此文本。

逐行读取输入的主要代码块:

public static void main(String[] args) {       
   try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {                               
            for (String nextLine, line = br.readLine(); line != null; line = nextLine) {                
                nextLine = br.readLine();
                // Work with "line"
            }
   }
   catch (IOException ex) {         
        System.exit(-1);
   }
}

但输入永远不会全部读取。总是缺少最后一行并且 line 永远不会是 null。经过少量调试后,我发现 nextLine = br.readLine(); 行上的 br.readLine() 没有 return 任何东西(字面上它没有 return 任何东西。虽然没有抛出异常。)和程序保持 运行 但不执行我的代码的任何其他行。我也试过从文件中读取,但没有出现这个问题。

当您的输入来自标准输入时,您必须让您的程序知道输入何时结束。否则会一直等待下一次输入。

因此,您应该决定一些标记输入结束的字符或字符串。

例如,在这里键入 done 将结束循环:

public static void main(String[] args) {       
   try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {                               
            for (String nextLine, line = br.readLine(); line != null && !line.equals("done"); line = nextLine) {                
                nextLine = br.readLine();
                // Work with "line"
            }
   }
   catch (IOException ex) {         
        System.exit(-1);
   }
}

这可能是因为 readLine() 阻塞,直到新行可用或流到达 EOF(当您从 System.in 读取时永远不会发生)。 你永远不会得到最后的输入,因为你的循环总是处理先前读取的行。

试试这个:

for (String line; (line = br.readLine()) != null;) 

并在您阅读完所有需要的输入后退出此循环,例如:

 if(line.equals("finish")){
     break;
 }