Ejecutando la línea de comandos en Java [duplicado]

Resuelto Ataman asked hace 13 años • 8 respuestas

¿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.

Ataman avatar Dec 14 '11 04:12 Ataman
Aceptado
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

kol avatar Dec 13 '2011 21:12 kol

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 /cdelante de su comando.

EDITAR: Y para obtener puntos de bonificación, también puede utilizar ProcessBuilderpara 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
Craigo avatar Sep 09 '2014 02:09 Craigo

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();
}
mountrix avatar Jun 18 '2015 22:06 mountrix
Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug");
Igor Popov avatar Dec 13 '2011 21:12 Igor Popov