首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Process施用之惑

2012-08-24 
Process应用之惑很多时候,我们需要调用系统命令来做些处理。比如,在程序中ping设备是否能连接,执行数据库的

Process应用之惑
   
    很多时候,我们需要调用系统命令来做些处理。比如,在程序中ping设备是否能连接,执行数据库的自动备份,以及程序的重启。这时候我们必须要使用Process类来完成这些功能。
    一般情况下,我们都会将命令执行过程中的信息输出,以便检查问题。但有时候我们还需知道这个执行的进程在什么时候结束,因为不仅要知道结束了,还要知道该进程完成时返回的结果。
    可能会说,这些不都是API已经给提供好的吗?过程中的消息可以用process.getInputStream()获取,进程最终结果可以由process.waitFor()得到。的确,这些看似可以办到,但其实,里面有陷阱。
   
首先以Runtime来创建我们需要的Process对象例子:
   

try {ProcessBuilder pbuilder=new ProcessBuilder("ping","192.168.0.125");pbuilder.redirectErrorStream(true);process=pbuilder.start();reader=new BufferedReader(new InputStreamReader(process.getInputStream()));String line=null;while((line=reader.readLine())!=null){System.out.println(line);}int result=process.waitFor();System.out.println(result);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}

现在无论你调用的是系统自带命令还是配置环境变量的其他命令,getInputStream()流都能给你过程信息和执行结果。
如果redirectErrorStream设置为false,那结果会和上面所说一样。

最后,还要说的是,得到的process.waitFor()结果。别以为这个执行结果值是一层不变的0,API没有给出具体有多少种类型的返回值,就我测试的结果来看:
0 successfully
1 failure
3 successfully! but a warning
....2没有测试出来

经过一个上午的不断测试,找源码来看,查资料,终于将这个已经没有认真理会的API缺陷透彻的梳理了一遍。
为了不重复别的话,很多基础知识没有描述,本着重点解决问题和存在的问题。

热点排行