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 + -
显示快捷键?