等待 Java 进程的回答?

Posted

技术标签:

【中文标题】等待 Java 进程的回答?【英文标题】:Waiting for answer from Java process? 【发布时间】:2012-09-22 04:03:14 【问题描述】:

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

    Java 启动 SomeTerminalApp SomeTerminalApp 要求 Java 提供的用户输入 SomeTerminalApp 处理输入,一段时间后显示输出并询问新的用户输入。 Java 检测到这一点,处理 SomeTerminalApp 的输出并插入新的用户输入,可能基于之前的输出。 步骤 3-4 重复任意次数(直到满足 Java 中的停止条件,具体取决于输出) 我们完成了: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;
 

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

好的,假设它打印出一些东西,例如当最后一个字符是NextInputPlease:SomethingWentWrongDebugPlease: 时,就完成了。那我应该如何改进我的方法呢?另外,在非安静模式下,如果在接受新的文本输入时看到下划线(经典的 MSDOS 光标),是不是 Java 无法检测到这一点? 如果它打印的内容以换行符结尾,那么您可以检查br.readLine() 的返回值,如果匹配则退出读取循环。如果没有,那么您需要编写自己的 readLine 等效项,一次读取一个字符并查找您希望看到的字符模式。 所以我基本上应该只做一个while(true) tryanalyzeOutput(br.readLine()); catch (Exception e)continue; ? :/ 这似乎是非常糟糕的编程风格。是我误解了什么还是你真的是这样的意思? 更像while(true) String line = br.readLine(); if (line.equals("NextInputPlease:")) return output; output.add(line);

以上是关于等待 Java 进程的回答?的主要内容,如果未能解决你的问题,请参考以下文章

Python Subprocess等待子进程列表[重复]

java线程的小问题与回答

试述死锁产生的原因和解决办法

Java多线程并发基础面试题回答

Java-死锁

Java多线程