Ejecutando la línea de comandos en Java [duplicado]
¿Existe alguna forma de ejecutar esta línea de comando dentro de una aplicación Java?
java -jar map.jar time.rel test.txt debug
Puedo ejecutarlo con comando pero no pude hacerlo en Java.
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
También puedes ver el resultado de esta manera:
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();
Y no lo olvide, si está ejecutando un comando de Windows, debe colocarlo cmd /c
delante de su comando.
EDITAR: Y para obtener puntos de bonificación, también puede utilizar ProcessBuilder
para pasar información a un programa:
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);
}
Esto ejecutará el comando de Windows choice /C YN /M "Press Y if you're cool"
y responderá con un archivo Y
. Entonces, la salida será:
Press Y if you're cool [Y,N]?Y
Para evitar que el proceso llamado se bloquee si genera muchos datos en la salida estándar y/o error, debe utilizar la solución proporcionada por Craigo. Tenga en cuenta también que ProcessBuilder es mejor que Runtime.getRuntime().exec(). Esto se debe a un par de razones: tokeniza mejor los argumentos y también se ocupa de la salida estándar de error (consulte también aquí ).
ProcessBuilder builder = new ProcessBuilder("cmd", "arg1", ...);
builder.redirectErrorStream(true);
final Process process = builder.start();
// Watch the process
watch(process);
Utilizo una nueva función "ver" para recopilar estos datos en un nuevo hilo. Este hilo finalizará en el proceso de llamada cuando finalice el proceso llamado.
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();
}
Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug");