等待Java进程的回答?

时间:2012-09-22 04:03:15

标签: java process

我正在尝试从Java调用命令行应用程序(让我们称之为SomeTerminalApp),更准确地说,应该发生以下情况。

  1. Java启动SomeTerminalApp
  2. SomeTerminalApp要求用户输入,Java提供
  3. SomeTerminalApp处理输入,一段时间后显示输出并询问新用户输入。
  4. Java检测到此情况,处理SomeTerminalApp的输出并使新用户输入不可用,可能基于以前的输出。
  5. 步骤3-4重复任意次数(直到满足Java中的停止条件,具体取决于输出)
  6. 我们完成了:Java关闭了SomeTerminalApp并再次关注自己的业务。
  7. 我该如何做到最好?目前,我得到了非常天真的流程处理

    Process p = Runtime.getRuntime().exec("/path/SomeTerminalApp -q"); //run in quiet mode
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
    

    带有一个插入输入的函数,并立即读取固定数量的输出行。

    public ArrayList<String> exec (ArrayList<String> input, int nrOfOutputLines) {
        for (int i=0; i<input.size(); i++) bw.write(input.get(i)+"\n");
        bw.flush();
        ArrayList<String> output = new ArrayList<String>();
        for (int i=0; i<nrOfOutputLines; i++) output.add(br.readLine());
        return output;
    } 
    

    唉,我经常不知道有多少行我必须阅读(因为输出是未知的并且会自动拆分多行),而且输出也不会立即出现(它可以输出显示从毫秒到几天。

    我应该如何正确对待这样一个过程,即监听到进程完成处理时(不只是放置固定计时器或没有计时器)并阅读全部产生的输出作为对最新命令的响应(不仅仅是固定数N的最后N行)?

1 个答案:

答案 0 :(得分:2)

你有正确的想法。没有简单的方法可以知道子进程何时完成。它要么在空闲之前打印出可识别为最后一个动作的东西(“完成”或其他东西),要么退出(你可以在输入中检测为EOF)。