使用Java中的Process类调用本地程序

来源:互联网 发布:手机摄影后期制作软件 编辑:程序博客网 时间:2024/05/20 16:44

用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现。
常用用法:

Process process = Runtime.getRuntime().exec(“.\p.exe”);
process.waitfor( ); “.\p.exe”是要执行的程序名 waitfor()目的为等待子进程完成再往下执行

1、执行DOS的内部命令

如果要执行一条DOS内部命令,有两种方法。
一种方法是把命令解释器包含在exec()的参数中。例如,执行dir命令,在NT上,可写成exec(“cmd.exe /c dir”),在windows 95/98下,可写成“command.exe /c dir”,其中参数“/c”表示命令执行后关闭Dos立即关闭窗口。
另一种方法是,把内部命令放在一个批命令my_dir.bat文件中,在Java程序中写成exec(“my_dir.bat”)。如果仅仅写成exec(“dir”),Java虚拟机则会报运行时错误。前一种方法要保证程序的可移植性,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器。后一种方法则不需要做更多的处理。

2、打开一个不可执行的文件

打开一个不可执行的文件,但该文件存在关联的应用程序,则可以有两种方式。
以打开一个word文档a.doc文件为例,Java中可以有以下两种写法:
exec(“start .\a.doc”);
exec(” c:\Program Files\Microsoft Office\office\winword.exe .\a.doc”);
显然,前一种方法更为简捷方便。

3、执行一个有标准输出的DOS可执行程序

import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;public class ShellTest {    public static void main(String[] args) {        Process process = null;        InputStream inputStream = null;        try {            process = Runtime.getRuntime().exec("cmd.exe /c dir");            process.waitFor();            inputStream = process.getInputStream();            byte[] b = new byte[1024];            int size = 0;            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();            while ((size = inputStream.read(b)) > 0) {                outputStream.write(b, 0, size);            }            System.out.println(outputStream.toString("gbk"));        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                inputStream.close();            } catch (IOException e) {                e.printStackTrace();            }            if (null != process) {                process.destroy();            }        }    }}

执行输出的结果如下:

 驱动器 D 中的卷是 软件 卷的序列号是 1839-9E09 D:\1肖宴资料\wangzhixuan-spring-shiro-training-master\spring-shiro-training 的目录2017/07/13  17:42    <DIR>          .2017/07/13  17:42    <DIR>          ..2017/07/14  14:25             1,513 .classpath2017/07/03  09:52               306 .gitignore2017/07/13  17:43             1,230 .project2017/07/13  17:43    <DIR>          .settings2017/07/03  09:52               685 build.sh2017/07/03  09:52    <DIR>          database2017/07/03  09:52            10,551 pom.xml2017/07/03  09:52             2,716 README.md2017/07/03  09:52    <DIR>          src2017/07/13  17:42    <DIR>          target               6 个文件         17,001 字节               6 个目录 85,116,977,152 可用字节

4、用DEL硬删除aaa.doc

Process process = Runtime.getRuntime().exec("cmd /c del f:\\aaa.doc"); 

5、从JDK1.5之后,Java开始提供包:java.lang.management 提供了一系列的用来在运行时管理和监督JVM和OS的管理接口。将用到的就是这个包中的一个类:ManagementFactory。

附:如何创建Process对象,一般有一下两种方法: 1、每个 ProcessBuilder 实例管理一个进程属性集。start()
方法利用这些属性创建一个新的 Process 实例。start()
方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。(ProcessBuilder这个是JDK5中新添加的final类)。
2、Runtime.exec()方法创建一个本机进程,并返回 Process 子类的一个实例

原创粉丝点击