2

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

  1. Java 启动 SomeTerminalApp
  2. SomeTerminalApp 要求 Java 提供的用户输入
  3. SomeTerminalApp 处理输入,一段时间后显示输出并询问新的用户输入。
  4. Java 检测到这一点,处理 SomeTerminalApp 的输出并插入新的用户输入,可能基于先前的输出。
  5. 步骤 3-4 重复任意次数(直到满足 Java 中的停止条件,具体取决于输出)
  6. 我们完成了:Java 关闭了 SomeTerminalApp 并再次处理自己的事情。

我应该如何最好地做到这一点?目前,我得到了非常幼稚的流程处理

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)?

4

1 回答 1

2

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

于 2012-09-22T04:15:24.340 回答