近期接到一个需求,要求执行一个外部程序命令,用一般的命令行的方法发现没有输出。Runtime的方法似乎只适用于Windows自带的命令,并不适用于外部程序的命令。后来在stack overflow的聊天室里发问后研究出了一个结果……
package test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Sugars {
public static void main(String[] args) {
BufferedReader br = null;
try {
File file = new File("D:\\test\\newImpl\\temp\\temp.tmp");//新建一个用来存储结果的缓存文件
if(!file.exists()) {
file.createNewFile();
}
ProcessBuilder pb = new ProcessBuilder().command("cmd.exe", "/c", "java -version").inheritIO();
pb.redirectErrorStream(true);//这里是把控制台中的红字变成了黑字,用通常的方法其实获取不到,控制台的结果是pb.start()方法内部输出的,简直就像是自欺欺人。
pb.redirectOutput(file);//把执行结果输出。
pb.start().waitFor();//等待语句执行完成,否则可能会读不到结果。
InputStream in = new FileInputStream(file);
br= new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
br = null;
file.delete();//卸磨杀驴。
} catch (Exception e) {
e.printStackTrace();
} finally {
if(br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}