java运行时进程-检查是否正在等待输入

java运行时进程-检查是否正在等待输入,java,runtime.exec,Java,Runtime.exec,我希望使用java的运行时创建一个进程: 例如Process proc=Runtime.getRuntime().exec(“cmd”) 然后,我想以某种方式等待进程,直到它处于“准备输入”状态,这将验证它是否完成了所有工作。怎么做呢 一件可能的事情是回显“--finished--”,并检查这一行是否是使用进程的标准输入法写的。但我不喜欢这个主意 有没有更好(更正式)的方法来做到这一点 顺便说一下,我需要我描述的这种效果。我想在将新命令写入批处理文件之前等待 多谢各位 有没有更好(更正式)的方

我希望使用java的运行时创建一个进程: 例如Process proc=Runtime.getRuntime().exec(“cmd”)

然后,我想以某种方式等待进程,直到它处于“准备输入”状态,这将验证它是否完成了所有工作。怎么做呢

一件可能的事情是回显“--finished--”,并检查这一行是否是使用进程的标准输入法写的。但我不喜欢这个主意

有没有更好(更正式)的方法来做到这一点


顺便说一下,我需要我描述的这种效果。我想在将新命令写入批处理文件之前等待

多谢各位

有没有更好(更正式)的方法来做到这一点

否。Java无法确定另一个程序是否正在等待输入。事实上,我认为如果不深入内核内存,根本不可能确定这一点(对于Linux/UNIX)。(在国际海事组织,这将是一个非常糟糕的主意)


最好的方法是检查外部程序的输出是否有一些文本指示批处理刚刚完成。。。希望你不要误报。(或者在不等待批处理完成的情况下对批处理进行排队,尽管听起来这对您来说不是一个解决方案。)

以下是一些想法。它们取决于您正在运行的程序是否希望从stdin和stdout进行读写

启动流程后,无需等待“准备输入”状态。如果需要发送命令,请使用
getOutputStream
并编写它们。如果另一个程序仍在准备就绪,那么您编写的数据将愉快地保存在缓冲区中,直到程序从stdin读取数据为止

使用将使您能够轻松地控制参数和环境。直接来自JavaDocs的示例:

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
Map<String, String> env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory(new File("myDir"));
Process p = pb.start();

你的问题似乎是获得最终要求结果的一种非常复杂的方式

首先,Java具有写入任意文件的能力。为什么不以单线程方式使用该功能?调用flush将确保实际执行写入

如果出于某种原因确实需要并发,请在进程上使用线程。然后,让线程做它需要做的事情,什么也不做。让父线程
join()
连接子线程。子线程完成后,父线程将继续


最后,在输出流或输入流上调用
available()
,可以告诉您在阻塞之前Java可以读取很多数据。这并不是您想要的,但我猜可以适应工作。

如果是这样,那么终端模拟器是如何工作的?如果进程没有等待输入,它们不允许用户键入…您在谈论哪些特定的终端模拟器?什么节目?什么操作系统?什么环境?(我使用的终端模拟器允许您在应用程序不等待字符时提前键入字符…)
OutputStream out = p.getOutputStream();
out.write("some useful data".getBytes());
out.flush();