如何用java代码运行外部程序?package com.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
public class EXERunner {
public void runExe(String exePath) {
try {
Process process = Runtime.getRuntime().exec(exePath);
// 注:process进程的输出流 相对于本进程就是输入流
Thread errorHandler = new Thread(new ErrorIOHandler(process.getErrorStream()));
Thread normalHandler = new Thread(new NormalIOHandler(process.getInputStream()));
Thread cmdHandler = new Thread(new CmdIOHandler(process.getOutputStream()));
errorHandler.start();
normalHandler.start();
cmdHandler.start();
process.waitFor(); // 等待process进程的输出流都被处理
int exitValue = process.exitValue();
if (exitValue == 0) {
System.out.println("进程正常退出");
} else {
System.out.println("进程异常退出");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new EXERunner().runExe("C:\\Windows\\System32\\ipconfig.exe");
}
}
// 处理外部程序的错误输出流
class ErrorIOHandler implements Runnable {
private InputStream error;
public ErrorIOHandler(InputStream error) {
this.error = error;
}
@Override
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(error));
String line = "";
try {
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 处理外部程序的正常输出流
class NormalIOHandler implements Runnable {
private InputStream normal;
public NormalIOHandler(InputStream normal) {
this.normal = normal;
}
@Override
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(normal));
String line = "";
try {
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 给外部程序发送命令
class CmdIOHandler implements Runnable {
private OutputStream out;
public CmdIOHandler(OutputStream out) {
this.out = out;
}
@Override
public void run() {
try {
String line = "";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//控制台读取流
while (true) {
line = br.readLine();//从控制台读取一行
if (line.equals("")) {
break;
} else {
out.write((line + "\r\n").getBytes());//发送命令给外部程序
}
out.flush();
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}