executor.java

来自「plugin for eclipse」· Java 代码 · 共 189 行

JAVA
189
字号
package isis.commons.exec;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * Execute an external program. Supports stream redirections.
 * 
 * @author sallai
 */
public class Executor {

	public static int exec(InputStream stdInRedirectedInputStream,
			OutputStream stdErrRedirectOutputStream,
			OutputStream stdOutRedirectOutputStream,
			String cmd) throws IOException, InterruptedException {

		Process process = exec(cmd);
		return handleStreams(process, stdInRedirectedInputStream, stdErrRedirectOutputStream, stdOutRedirectOutputStream);
	}

	public static int exec(InputStream stdInRedirectedInputStream,
			OutputStream stdErrRedirectOutputStream,
			OutputStream stdOutRedirectOutputStream,
			String[] cmd) throws IOException, InterruptedException {

		Process process = exec(cmd);
		return handleStreams(process, stdInRedirectedInputStream, stdErrRedirectOutputStream, stdOutRedirectOutputStream);
	}
	
	public static int exec(InputStream stdInRedirectedInputStream,
			OutputStream stdErrRedirectOutputStream,
			OutputStream stdOutRedirectOutputStream,
			String[] cmd, String[] env) throws IOException, InterruptedException {

		Process process = exec(cmd, env);
		return handleStreams(process, stdInRedirectedInputStream, stdErrRedirectOutputStream, stdOutRedirectOutputStream);
	}
	public static int exec(InputStream stdInRedirectedInputStream,
			OutputStream stdErrRedirectOutputStream,
			OutputStream stdOutRedirectOutputStream,
			String[] cmd, String[] env, File dir) throws IOException, InterruptedException {

		Process process = exec(cmd, env, dir);
		return handleStreams(process, stdInRedirectedInputStream, stdErrRedirectOutputStream, stdOutRedirectOutputStream);
	}
	public static int exec(InputStream stdInRedirectedInputStream,
			OutputStream stdErrRedirectOutputStream,
			OutputStream stdOutRedirectOutputStream,
			String cmd, String[] env) throws IOException, InterruptedException {

		Process process = exec(cmd, env);
		return handleStreams(process, stdInRedirectedInputStream, stdErrRedirectOutputStream, stdOutRedirectOutputStream);
	}
	public static int exec(InputStream stdInRedirectedInputStream,
			OutputStream stdErrRedirectOutputStream,
			OutputStream stdOutRedirectOutputStream,
			String cmd, String[] env, File dir) throws IOException, InterruptedException {

		Process process = exec(cmd, env, dir);
		return handleStreams(process, stdInRedirectedInputStream, stdErrRedirectOutputStream, stdOutRedirectOutputStream);
	}
	
	public static int handleStreams(Process process,
			InputStream stdInRedirectedInputStream,
			OutputStream stdErrRedirectOutputStream,
			OutputStream stdOutRedirectOutputStream) throws IOException,
			InterruptedException {

		Thread.sleep(1); // this is a magic workaround I found on
		// forum.java.sun.com
		// I'm not sure if we need it at all...

		StreamHandler stdInHandler = new StreamHandler(
				stdInRedirectedInputStream, process.getOutputStream());
		StreamHandler stdErrHandler = new StreamHandler(process
				.getErrorStream(), stdErrRedirectOutputStream);
		StreamHandler stdOutHandler = new StreamHandler(process
				.getInputStream(), stdOutRedirectOutputStream);

		stdInHandler.start();
		stdErrHandler.start();
		stdOutHandler.start();

		// wait until process finishes
		int exitCode = process.waitFor();

		// wait until streamhandlers finish
		while (stdErrHandler.isAlive() || stdOutHandler.isAlive()) {
			Thread.sleep(200);
		}

		return exitCode;
	}

	private static Process exec(String cmd) throws IOException {
		// debug
		System.out.println(cmd);

		Runtime rt = Runtime.getRuntime();
		Process proc = rt.exec(cmd);
		return proc;
	}

	private static Process exec(String[] cmd) throws IOException {

		// debug
		for (int i = 0; i < cmd.length; i++) {
			System.out.print(cmd[i] + " ");
		}
		System.out.println();

		Runtime rt = Runtime.getRuntime();
		Process proc = rt.exec(cmd);
		return proc;
	}

	private static Process exec(String[] cmd, String[] env) throws IOException {
		// debug
		for (int i = 0; i < cmd.length; i++) {
			System.out.print(cmd[i] + " ");
		}
		System.out.println();

		Runtime rt = Runtime.getRuntime();
		Process proc = rt.exec(cmd, env);
		return proc;
	}

	private static Process exec(String cmd, String[] env) throws IOException {
		// debug
		System.out.println(cmd);

		Runtime rt = Runtime.getRuntime();
		Process proc = rt.exec(cmd, env);
		return proc;
	}

	private static Process exec(String cmd, String[] env, File dir)
			throws IOException {
		// debug
		System.out.println(cmd);

		Runtime rt = Runtime.getRuntime();
		Process proc = rt.exec(cmd, env, dir);
		return proc;
	}

	private static Process exec(String[] cmd, String[] env, File dir)
			throws IOException {
		// debug
		for (int i = 0; i < cmd.length; i++) {
			System.out.print(cmd[i] + " ");
		}
		System.out.println();

		Runtime rt = Runtime.getRuntime();
		Process proc = rt.exec(cmd, env, dir);
		return proc;
	}

	public static class Test {
		// main method included for testing...
		public static void main(String[] args) {

			try {
				String[] cmd = { "c:/cygwin/usr/local/bin/avr-cpp.exe" };
				InputStream stdIn = new BufferedInputStream(
						new FileInputStream("c:/tinyos-1.x/tos/system/tos.h"));
				OutputStream stdOut = new BufferedOutputStream(
						new FileOutputStream("c:/tmp/test/tosh_output"));
				Executor.exec(stdIn, null, stdOut, cmd, null, null);

				stdIn.close();
				stdOut.close();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?