Process p = null;
String line = null;
BufferedReader stdout = null;
//list the files and directorys under C:\
list.add("CMD.EXE");
list.add("/C");
list.add("dir");
pb = new ProcessBuilder(list);
pb.directory(new File("C:\\"));
p = pb.start();
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
//echo the value of NAME
pb = new ProcessBuilder();
mand(new String[] {"CMD.exe", "/C", "echo %NAME%"});
pb.environment().put("NAME", "TEST");
p = pb.start();
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5、获取进程的返回值
通常,一个程序/进程在执行结束后会向操作系统返回一个整数值,0一般代表执行成功,非0表示执行出现问题 。有两种方式可以用来获取进程的返回
值 。一是利用waitFor(),该方法是阻塞的 , 执导进程执行完成后再返回 。该方法返回一个代表进程返回值的整数值 。另一个方法是调用
exitValue()方法,该方法是非阻塞的,调用立即返回 。但是如果进程没有执行完成,则抛出异常 。
6、阻塞的问题
由Process代表的进程在某些平台上有时候并不能很好的工作,特别是在对代表进程的标准输入流、输出流和错误输出进行操作时,如果使用不慎 , 有可能导致进程阻塞,甚至死锁 。
如果将以上事例中的从标准输出重读取信息的语句修改为从错误输出流中读?。?
stdout = new BufferedReader(new InputStreamReader(p
.getErrorStream()));
那么程序将发生阻塞,不能执行完成 , 而是hang在那里 。
当进程启动后 , 就会打开标准输出流和错误输出流准备输出,当进程结束时,就会关闭他们 。在以上例子中 , 错误输出流没有数据要输出,标准输出流中
有数据输出 。由于标准输出流中的数据没有被读取,进程就不会结束,错误输出流也就不会被关闭,因此在调用readLine()方法时,整个程序就会被阻
塞 。为了解决这个问题,可以根据输出的实际先后,先读取标准输出流,然后读取错误输出流 。
但是,很多时候不能很明确的知道输出的先后 , 特别是要操作标准输入的时候,情况就会更为复杂 。这时候可以采用线程来对标准输出、错误输出和标准输入进行分别处理,根据他们之间在业务逻辑上的关系决定读取那个流或者写入数据 。
针对标准输出流和错误输出流所造成的问题,可以使用ProcessBuilder的redirectErrorStream()方法将他们合二为一 , 这时候只要读取标准输出的数据就可以了 。
当在程序中使用Process的waitFor()方法时,特别是在读取之前调用waitFor()方法时,也有可能造成阻塞 。可以用线程的方法来解决这个问题,也可以在读取数据后,调用waitFor()方法等待程序结束 。
总之,解决阻塞的方法应该有两种:
(1)使用ProcessBuilder类,利用redirectErrorStream方法将标准输出流和错误输出流合二为一,在用start()方法启动进程后 , 先从标准输出中读取数据,然后调用waitFor()方法等待进程结束 。
如:
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Test3 {
public static void main(String[] args) {
推荐阅读
- 毛绒熊手机壳华为怎么样,毛绒熊diy
- 如何组建新媒体团队,新媒体公司团队组建方案
- 工厂直播背景素材视频,工厂直播背景素材视频下载
- vb.net最难的知识点的简单介绍
- h5css显示动画效果,h5炫酷动画效果
- sap公司组织架构,sap的架构
- 阿里云搭建云服务器,阿里云服务器怎么搭建服务器环境
- mysql大数据怎么解决 mysql大数据量怎么设计表
- python运行爬虫代码,python爬虫简单代码