Running Command Line in Java [duplicate]

Is there a way to run this command line within a Java application?

java -jar map.jar time.rel test.txt debug 

I can run it with command but I couldn't do it within Java.

2

8 Answers

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

5

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 
4

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 process watch(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(); } 
1
Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 
1
import java.io.*; Process p = Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 

Consider the following if you run into any further problems, but I'm guessing that the above will work for you:

Problems with Runtime.exec()

what about

public class CmdExec { public static Scanner s = null; public static void main(String[] args) throws InterruptedException, IOException { s = new Scanner(System.in); System.out.print("$ "); String cmd = s.nextLine(); final Process p = Runtime.getRuntime().exec(cmd); 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(); } } 

Have you tried the exec command within the Runtime class?

Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug") 

Runtime - Java Documentation

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

You Might Also Like