天天看点

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