天天看點

java運作外部程式

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