大概的写法是这样的: Process process = new ProcessBuilder("执行程序","参数").start(); process.getOutputStream.close(); if(Porcess.waitFor()==0) { //执行的一些操作 } else { //执行另外的一些操作 }现在的问题是process的进程调起的程序界面无法显示,导致料Eclipse一直等待。但是在windows命令行下以相同的参数启动调用的程序,那个界面可以出来
为什么要关闭process的输出流 process.getOutputStream.close(); 估计是LZ的process死锁了 javadoc文档里明确的说明了java.lang 类 Process java.lang.Object java.lang.Process--------------------------------------------------------------------------------public abstract class Processextends ObjectProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获得相关信息。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。 创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin、stdout 和 stderr)操作都将通过三个流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。 当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。 对于带有 Process 对象的 Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。 上面红色字体部分,所以LZ要自己根据情况去清空process的输入输出流缓存
如果有返回值如何处理,没有的话怎么处理,超时的话怎么处理。
如果一直没有反应,哪怕有个提示说连结错误呢,然后关闭此次连结。
Process process = new ProcessBuilder("执行程序","参数").start();
process.getOutputStream.close();
if(Porcess.waitFor()==0)
{
//执行的一些操作
}
else
{
//执行另外的一些操作
}现在的问题是process的进程调起的程序界面无法显示,导致料Eclipse一直等待。但是在windows命令行下以相同的参数启动调用的程序,那个界面可以出来
process.getOutputStream.close();
估计是LZ的process死锁了
javadoc文档里明确的说明了java.lang
类 Process
java.lang.Object
java.lang.Process--------------------------------------------------------------------------------public abstract class Processextends ObjectProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获得相关信息。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。 创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin、stdout 和 stderr)操作都将通过三个流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。 当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。 对于带有 Process 对象的 Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。
上面红色字体部分,所以LZ要自己根据情况去清空process的输入输出流缓存
不过不是这个问题,因为我写那句的时候,用多线程来读取输出流是一样的。很怪异的问题,启动程序的时候我附加到调起的进程进行调式,那个窗体又可以显示。不知道是不是Eclipse不允许那个窗体弹出模式的对象框。