java - 等待 Java 进程的答复?

标签 java process

我正在尝试从 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 行)?

最佳答案

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

关于java - 等待 Java 进程的答复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12540579/

相关文章:

c# - 捕获外部进程输出

c++ - fork() 和 exec() 两个子进程

python - 如何在可接受的时间内让所有正在运行的 Python 进程在 Windows 下运行?

java - 为什么 Runtime.freeMemory() 仅在创建大对象时才会更改?

java - 线程中出现异常 "main"org.hibernate.HibernateException : hibernate. cfg.xml 未找到

java - Spring Jpa 服务调用与 Jpa 查询

Java:If 与 Switch

Java:为什么我不断收到此方法的 StringIndexOutOfBoundsException?

c++ - 如何在 C++ 任务管理器上更改进程的名称?

concurrency - Lua多并发进程