Java Runtime进程 - 检查是否等待输入

9
我希望使用Java的Runtime创建一个进程: 例如,Process proc = Runtime.getRuntime().exec("cmd");
然后,我想以某种方式等待该进程,直到它处于“准备好输入”状态,这将验证它已完成所有工作。有没有办法实现?
一种可能的方法是回显“---finished---”,并检查是否使用进程的stdin写入了此行。但我不喜欢这个想法。
有没有更好(更正式)的方法来做到这一点?
顺便说一下,我需要这种效果,因为我想在写入新命令到批处理文件之前等待。
谢谢。
3个回答

7
有更好(更正式)的方法来做这件事吗?
没有。Java没有提供一种方法来确定另一个程序是否正在等待输入。实际上,我认为这是不可能的(对于Linux / UNIX),而不必在内核内存中挖掘。 (在我看来,那将是一个非常糟糕的想法...)。您最好检查外部程序的输出,以查找指示批处理刚刚完成的某些文本,并希望您不会得到错误的结果。(或者只是排队等待批处理完成,但听起来这对您来说不是一个解决方案。)

如果是这种情况,那么终端仿真器是如何工作的呢?如果进程没有等待输入,它们不会让用户输入... - Sri Harsha Chilakapati
你在谈论哪些特定的终端仿真器?是什么程序?是什么操作系统?是什么环境?(我使用的终端仿真器允许您在应用程序不等待字符时提前输入字符....) - Stephen C

6
这里有几个想法。它们取决于您运行的程序是否希望从标准输入和输出中读写。
一旦启动进程,就没有必要等待“准备好输入”状态了。如果您需要发送命令,请使用getOutputStream并编写它们。如果另一个程序仍在准备好自己,您编写的数据将愉快地停留在缓冲区中,直到该程序从标准输入读取为止。
使用ProcessBuilder将让您轻松控制参数和环境。以下是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();

然后,进行读取或写入:
OutputStream out = p.getOutputStream();
out.write("some useful data".getBytes());
out.flush();

3

你的问题似乎是以一种非常复杂的方式获取所需的最终结果。

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

如果您真的需要并发,请使用线程而不是进程。然后,使线程执行它需要执行的任务,不要多做其他事情。让父线程join()子线程。当子线程完成时,你的父线程将恢复执行。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接