在Java中标准输入中为空

时间:2015-11-14 11:18:05

标签: java stream

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

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

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。经过一点调试后,我发现br.readLine()行上的nextLine = br.readLine();没有返回任何内容(字面意思是它没有返回任何内容。但是没有抛出任何异常。)程序继续运行但没有执行任何其他操作我的代码行。我也试过从文件中读取,但这个问题不会发生。

2 个答案:

答案 0 :(得分:3)

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

试试这个:

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

当你已经阅读了所需的所有输入时,从这个循环中断,例如:

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

答案 1 :(得分:2)

当您的输入来自标准输入时,您必须在输入结束时让您的程序知道。否则它将继续等待输入下一个输入。

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

例如,在此输入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);
   }
}