java redirect runtime exec runtime.exec

java - Redirecciona la salida Runtime.getRuntime(). Exec() con System.setOut();



redirect runtime.exec (3)

Desde JDK 1.5 hay java.lang.ProcessBuilder que maneja std y err streams también. Es una especie de reemplazo para java.lang.Runtime y deberías usarlo.

Tengo un programa Test.java:

import java.io.*; public class Test { public static void main(String[] args) throws Exception { System.setOut(new PrintStream(new FileOutputStream("test.txt"))); System.out.println("HelloWorld1"); Runtime.getRuntime().exec("echo HelloWorld2"); } }

Se supone que esto debe imprimir HelloWorld1 y HelloWorld2 en el archivo text.txt. Sin embargo, cuando veo el archivo, solo veo HelloWorld1.

  1. ¿A dónde fue HelloWorld2? ¿Se desvaneció en el aire?

  2. Digamos que quiero redirigir HelloWorld2 a test.txt también. No puedo agregar un ">> test.txt" en el comando porque obtendré un error de archivo ya abierto. Entonces, ¿cómo hago esto?


La salida estándar de Runtime.exec no se envía automáticamente a la salida estándar de la persona que llama.

Algo como esto debe hacer: tener acceso a la salida estándar del proceso bifurcado, leerlo y luego escribirlo. Tenga en cuenta que la salida del proceso bifurcado está disponible para el padre mediante el método getInputStream() de la instancia de Proceso.

public static void main(String[] args) throws Exception { System.setOut(new PrintStream(new FileOutputStream("test.txt"))); System.out.println("HelloWorld1"); try { String line; Process p = Runtime.getRuntime().exec( "echo HelloWorld2" ); BufferedReader in = new BufferedReader( new InputStreamReader(p.getInputStream()) ); while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); } catch (Exception e) { // ... } }


System.out NO es la salida estándar del nuevo proceso que generó al llamar a exec (). Si desea ver el "HelloWorld2", debe obtener el Proceso devuelto por la llamada exec (), luego llamar a getOutputStream () desde ahí.