Saltar al contenido

Ejecutar línea de comandos en Java

Luego de de una larga recopilación de información hemos podido solucionar esta duda que pueden tener algunos de nuestros lectores. Te brindamos la respuesta y deseamos resultarte de mucha apoyo.

Solución:

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 puede ver la salida 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 olvide, si está ejecutando un comando de Windows, debe poner cmd /c frente a su mando.

EDITAR: Y para puntos de bonificación, también puedes usar ProcessBuilder para pasar la entrada 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 responde con un 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);

Uso una nueva función “reloj” para recopilar estos datos en un nuevo hilo. Este subproceso terminará 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();

Reseñas y valoraciones

Recuerda algo, que tienes la opción de decir si atinaste tu interrogante a tiempo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *