import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; class ProcessResultReader extends Thread { final InputStream is; final String type; final StringBuilder sb; /** * * @param is * @param type */ ProcessResultReader( final InputStream is, String type) { this.is = is; this.type = type; this.sb = new StringBuilder(); } public void run() { try { final InputStreamReader isr = new InputStreamReader(is); final BufferedReader br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) { this.sb.append(line).append("\n"); } } catch (final IOException ioe) { System.err.println(ioe.getMessage()); throw new RuntimeException(ioe); } } @Override public String toString() { return this.sb.toString(); } }
Upper class is used below
package main.java.utils; import java.io.File; import java.util.concurrent.TimeUnit; public class ProcessManager { private ProcessResultReader stderrReader; private ProcessResultReader stdoutReader; private Process p; public int exitCode = Integer.MIN_VALUE; public String command; public ProcessManager(String command) { this.command = command; this.stderrReader = null; this.stdoutReader = null; } private void runCommand(boolean waitEnding, long timeout, boolean isCmd, File dir) { try { if (isCmd) if (dir != null) p = Runtime.getRuntime().exec(String.format("cmd /c %s", command), null, dir); else p = Runtime.getRuntime().exec(String.format("cmd /c %s", command)); else if (dir != null) p = Runtime.getRuntime().exec(command, null, dir); else p = Runtime.getRuntime().exec(command); stderrReader = new ProcessResultReader(p.getErrorStream(), "STDERR"); stdoutReader = new ProcessResultReader(p.getInputStream(), "STDOUT"); stderrReader.start(); stdoutReader.start(); if (waitEnding) exitCode = p.waitFor(); if (timeout > 0) p.waitFor(timeout, TimeUnit.SECONDS); } catch (Exception e) { Messages.getInstance().fatal(e.getMessage(), e); } finally { if (waitEnding) p.destroy(); //assertEquals("Process exit code not valid!", 0, exitCode); } } public void runCommand(long timeout) { this.runCommand(true, timeout, true, null); } public void runCommand() { this.runCommand(true, 0, true, null); } public void runCommand(File workingDir) { this.runCommand(true, 0, true, workingDir); } public void runCommand(boolean waitEnding, boolean isCmd) { this.runCommand(waitEnding, 0, isCmd, null); } public void runCommand(boolean waitEnding, boolean isCmd, File workingDir) { this.runCommand(waitEnding, 0, isCmd, workingDir); } public void destroy() { p.destroy(); } public String getStdout() { if (stdoutReader != null) { return stdoutReader.sb.toString(); } return ""; } public String getStdError() { if (stderrReader != null) { return stderrReader.sb.toString(); } return ""; } }
Examples:
ProcessManager pm = new ProcessManager("ping 8.8.8.8"); pm.runCommand(true, true); String sb = processManager.getStdout() + processManager.getStdError(); ProcessManager pm = new ProcessManager("java WhichToStart"); pm.runCommand(true, false); String sb = processManager.getStdout() + processManager.getStdError();