package net.fusejna; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * Run a process, grab all from stdout, return that. */ final class ProcessGobbler { private static final class Gobbler extends Thread { private final InputStream stream; private String contents = null; private boolean failed = false; Gobbler(final InputStream stream) { this.stream = stream; start(); } private final String getContents() { if (failed) { return null; } return contents; } @Override public final void run() { final BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); final StringBuilder contents = new StringBuilder(); String line; try { while ((line = reader.readLine()) != null) { contents.append(line); } } catch (final IOException e) { failed = true; return; } this.contents = contents.toString(); } } private final Process process; private final Gobbler stdout; private final Gobbler stderr; private Integer returnCode = null; ProcessGobbler(final String... args) throws IOException { process = new ProcessBuilder(args).start(); stdout = new Gobbler(process.getInputStream()); stderr = new Gobbler(process.getErrorStream()); } int getReturnCode() { join(); return returnCode; } String getStderr() { join(); return stderr.getContents(); } String getStdout() { join(); return stdout.getContents(); } private void join() { try { returnCode = process.waitFor(); } catch (final InterruptedException e) { // Too bad } } }