如何使用javas Process.waitFor()?
我正在尝试从Java运行命令行命令,并且快速的健全性检查让我意识到我遇到麻烦的原因是我无法让下面的pr.waitFor()
调用工作。 这个程序在不到30秒后结束,并且在“foo:”之后不打印任何内容。 我预计它需要超过30秒并在“foo:”之后打印一个随机数。 我究竟做错了什么?
import java.io.BufferedReader; import java.io.InputStreamReader; public class Sample { public static void main(String[] args) throws Exception { Runtime rt = Runtime.getRuntime(); Process pr = rt.exec("sleep 32; echo $RANDOM"); pr.waitFor(); BufferedReader input = new BufferedReader( new InputStreamReader(pr.getInputStream())); String line=null; StringBuilder s = new StringBuilder(); while((line=input.readLine()) != null) { System.out.println(s); s.append(line); } System.out.println("foo: " + s.toString()); } }
你应该试试这个:
Process pr = rt.exec(new String[]{ "bash","-c", "sleep 32; echo $RANDOM" });
这将启动一个shell进程,然后在shell中运行您的命令。 在命令完成之后,shell才会返回。
如果这对您有用,请告诉我。
Process.waitFor()
阻塞当前线程,直到进程终止,此时执行控制返回到生成进程的线程。
在发布的代码中,一旦进程终止(即,在Process.waitFor调用之后),现在终止的进程的输入流不再具有可以读取的任何数据。 因此,读取流的内容并将其打印出来将不会产生任何有形的输入。
如果需要读取流的内容,则需要生成一个新线程,该线程将在子进程终止之前根据需要处理读取输入流和写入输出流的必要活动。
或者您可以在同一个线程中执行读取和写入,但在等待子进程终止之前。 换句话说,你需要切换包含pr.waitFor();
的行的顺序pr.waitFor();
以及从InputStream读取的行。
关于SO的相关问题:
- Process.waitFor(),threads和InputStreams
您正在尝试执行shell命令。 你应该尝试执行一个程序。
如Femi的回答所示,你可以调用bash作为可执行文件,然后传递给bash执行sleep和echo命令的参数。
- 使用CQL jdbc驱动程序时应该是什么连接字符串
- 无法从Vista上的HKEY_LOCAL_MACHINE读取配置数据
- JBOSS 7有两个上下文。 一个使用SSL Mutual Auth,另一个只使用SSL
- 为什么要导入javax.swing。*而不是java.swing。*
- java.lang.ClassNotFoundException:javax.persistence.NamedStoredProcedureQuery – Hibernate错误
- 从java检查服务可用性
- 如何使用Camel和Jackson库将嵌套的键,值对编组到JSON中?
- 如果线程已被中断,Thread.sleep会抛出吗?
- Java客户端/服务器回合制帮助