Runtime.getRuntime().exec(...)使用方法


先週のクイズ大会の時、なぜ自分が呼び出したのかというRuntimeを多くの人に聞かれた.getRuntime().exec(...)メソッドは返されませんでした.実は戻ってこない原因はたくさんありますが、正しいexecを書くことを前提にしています.
詳細については、コードのリンクを参照してください.
次はこの正しい例です.
public class RuntimeExec {
    /**
     * Runtime execute.
     *
     * @param cmd the command.
     * @return success or failure
     * @see {@link http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4}
     * @since 1.1
     */
    public static boolean runtimeExec(String cmd) {
        try {
            Process proc = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd});

            // any error message?
            StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");

            // any output?
            StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");

            // kick them off
            errorGobbler.start();
            outputGobbler.start();


            if (proc.waitFor() != 0) {
                System.err.println("  \"" + cmd + "\"    =" + proc.exitValue());
                return false;
            } else {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    static class StreamGobbler extends Thread {
        InputStream is;
        String type;

        StreamGobbler(InputStream is, String type) {
            this.is = is;
            this.type = type;
        }

        public void run() {
            try {
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line = null;
                while ((line = br.readLine()) != null)
                    System.out.println(type + ">" + line);
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }

}