引言
平日里,我们看到了很多已经成型的可执行文件,而且经过了一定的封装。因为开源的关系,大多时候可以自己使用eclipse进行编译,但也常常遇到不如直接调用更加方便的情况。那么这时候,就需要使用Java来直接调用这些出色的可执行文件。之前在开发有关GIS项目的时候其中有一个项目要平凡的用Java程序去调用exe可执行文件,具体为什么要这样做我也不清楚,一切任务听从领导的安排。
表达能力不好直接上代码~~~
一个小Case
其实很简单, 首先编写一个命令command;
Runtime.getRuntime()得到当前运行是环境;
然后调用它的exec(cmd)方法, 该方法返回一个进程process;
查看process的API可以看到, process只有几个方法, 却很有用, 如下:
destroy():
杀掉子进程;
exitValue(): 返回子进程的出口值;
getErrorStream(): 获得子进程的错误流;
getInputStream(): 获得子进程的输入流;
getOutputStream(): 获得子进程的输出流;
waitFor(): 导致当前线程等待,如果必要,一直要等到由该 Process 对象表示的进程已经终止。
package com.hadoop.util;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
/*
* 运行可执行文件:.exe
* 当要执行一个本地机器上的可执行文件时,
* 可以使用java.lang包中的Runtime类,首先使用Runtime类,首先
* 使用Runtime类声明一个对象
*{
* Runtime sc =Runtime.getRuntime();
* sc可以调用exec(String command) 方法打开本地湖区上的可执行文件或执行一个操作。
* }
*/
public class transferExe {
public static void main(String[] args) {
//需要传入的参数(ps: 多个参数用空格隔开)
String paras = " --task C:\\Users\\Admin\\.cesiumlab\\tasks\\terrain_99254c80b1ef11ea8edfe728504fc83a.json --taskserver tcp://127.0.0.1:9001 --taskname 99254c80b1ef11ea8edfe728504fc83a --log_dir C:\\Users\\Admin\\.cesiumlab\\logs";
//调用的exe可执行文件(ps: 调用可执行文件和参数拼接必须要用空格隔开)
String cmd = "C:\\Program Files\\cesiumlab2\\tools\\terrainbuilder.exe" + paras;
openExe(cmd);
}
public static void openExe(String cmd) {
BufferedReader br = null;
BufferedReader brError = null;
try {
//执行exe cmd可以为字符串(exe存放路径)也可为数组,调用exe时需要传入参数时,可以传数组调用(参数有顺序要求)
Process p = Runtime.getRuntime().exec(cmd);
String line = null;
//获得子进程的输入流。
br = new BufferedReader(new InputStreamReader(p.getInputStream()));
//获得子进程的错误流。
brError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((line = br.readLine()) != null || (line = brError.readLine()) != null) {
//输出exe输出的信息以及错误信息
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}