在Java中,交互式外壳上的BufferedReader读取线块



我有一个JAR文件,该文件一直在等待用户输入,处理和打印结果(以多行)为单词

>Input sentence 1
Result 1
Result 2
>Input sentence 2
Result 1
Result 2
Result 3
>

退出此JAR程序的唯一方法是按CTRL C。

现在,我想从我的Java程序中调用此JAR文件。我的代码看起来像这样:

processBuilder = new ProcessBuilder(PATH_TO_BIN);
Process process = processBuilder.start();
writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
writer.write(inputSentence);
writer.newLine();
writer.flush();
String line;
while ((line = reader.readLine()) != null){ //<<<< it hangs here
    System.out.println(line);
}

我的程序可以成功打印出" JAR"程序返回的结果,但是它一直挂在下一个reader.readLine(),我无法提供" JAR"程序的下一个输入。

有什么方法可以解决此问题?

预先感谢!

您可以使用一个线程读取和其他文字写,然后它不会阻止读取,如这样:

    ProcessBuilder processBuilder = new ProcessBuilder(PATH_TO_BIN);
    Process process = processBuilder.start();
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
      
    new Thread () {
      public void run() {
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line = null;
        do {             
          line = reader.readLine();
          System.out.println(line);
        } while (line != null); // <<<< it waits here for next line of input 
      }
    }.start();
       
    // and here you can write something to the process InputSteram...
    writer.write(inputSentence);
    writer.newLine();
    writer.flush();

方法ready()来自bufferedreader -tells是否准备好读取此流。

您可以使用此方法检查是否准备好阅读流,如果是,则可以完成您的工作,

while (reader.ready()){
//Do the processing
}

看看这是否有效。

我要依靠 @krzystof的答案,但是我假设您将使用Java 7或8( )。

在这种情况下,您应该使用try-with-resources,如下:

public static void main (String[] args) throws java.lang.Exception {
    ProcessBuilder prBuilder = new ProcessBuilder("/path/to/bin");
    Process process = prBuilder.start();
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())) | BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()))) {
        String line;
        while ((line = reader.readLine()) != null) {
            // Process input
        }
    } catch (IOException ex) {
        // Process IOException
    } finally {
        process.kill();
    }
}

最新更新