我希望使用java的运行时创建一个进程: 例如。进程proc = Runtime.getRuntime()。exec(“cmd”);
然后,我想以某种方式等待该过程,直到它处于“准备输入”状态,这将验证它已完成所有工作。无论如何怎么做?
有一件事可能是回应“--- finished ---”并检查这一行是否是使用进程的stdin写的。但我不喜欢这个主意。
有没有更好(更正式)的方法来做到这一点?
顺便说一句,我在描述它时需要这个效果。我想在将新命令写入批处理文件之前等待。
谢谢。
答案 0 :(得分:6)
有没有更好(更正式)的方法来做到这一点?
没有。 Java无法确定另一个程序是否在等待输入。实际上,我不相信这可以确定这一点(对于Linux / UNIX)而不需要在内核内存中进行挖掘。 (那将是一个非常糟糕的主意...... IMO)。
您最好的选择是检查外部程序的输出是否有一些文本表明批次刚刚完成...并希望您不会得到误报。 (或者只是将批次排队而不等待它们完成,尽管听起来这对你来说不是一个解决方案。)
答案 1 :(得分:6)
以下是一些想法。它们取决于您运行的程序是否希望从stdin和stdout读取和写入。
启动该过程后,无需等待“准备输入”状态。如果需要发送命令,请使用getOutputStream
并编写它们。如果其他程序仍在准备就绪,那么您编写的数据将很快放在缓冲区中,直到程序从stdin读取为止。
使用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();
答案 2 :(得分:3)
您的问题似乎是获得最终所需结果的一种非常复杂的方式。
首先,Java具有写入任意文件的能力。为什么不以单线程方式使用该功能?调用flush将确保实际执行写入...
如果由于某种原因确实需要并发,请在进程上使用线程。然后,让线程做它需要做的事情,仅此而已。让父线程join()
成为子线程。子线程完成后,您的父线程将恢复。
最后,在输出流或输入流上调用available()
可以告诉您在阻塞之前Java可以读取大量数据。这不是你想要的,但可以适应我正在猜测的工作。