Running Command Line in Java [duplicate] Running Command Line in Java [duplicate] java java

Running Command Line in Java [duplicate]


Runtime rt = Runtime.getRuntime();Process pr = rt.exec("java -jar map.jar time.rel test.txt debug");

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html


You can also watch the output like this:

final Process p = Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug");new Thread(new Runnable() {    public void run() {        BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));        String line = null;        try {            while ((line = input.readLine()) != null)                System.out.println(line);        } catch (IOException e) {            e.printStackTrace();        }    }}).start();p.waitFor();

And don't forget, if you are running a windows command, you need to put cmd /c in front of your command.

EDIT: And for bonus points, you can also use ProcessBuilder to pass input to a program:

String[] command = new String[] {        "choice",        "/C",        "YN",        "/M",        "\"Press Y if you're cool\""};String inputLine = "Y";ProcessBuilder pb = new ProcessBuilder(command);pb.redirectErrorStream(true);Process p = pb.start();BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));writer.write(inputLine);writer.newLine();writer.close();String line;while ((line = reader.readLine()) != null) {    System.out.println(line);}

This will run the windows command choice /C YN /M "Press Y if you're cool" and respond with a Y. So, the output will be:

Press Y if you're cool [Y,N]?Y


To avoid the called process to be blocked if it outputs a lot of data on the standard output and/or error, you have to use the solution provided by Craigo. Note also that ProcessBuilder is better than Runtime.getRuntime().exec(). This is for a couple of reasons: it tokenizes better the arguments, and it also takes care of the error standard output (check also here).

ProcessBuilder builder = new ProcessBuilder("cmd", "arg1", ...);builder.redirectErrorStream(true);final Process process = builder.start();// Watch the processwatch(process);

I use a new function "watch" to gather this data in a new thread. This thread will finish in the calling process when the called process ends.

private static void watch(final Process process) {    new Thread() {        public void run() {            BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));            String line = null;             try {                while ((line = input.readLine()) != null) {                    System.out.println(line);                }            } catch (IOException e) {                e.printStackTrace();            }        }    }.start();}