如何用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();
}
}
}