Redirigir Runtime.getRuntime (). Exec () salida con System.setOut ();

Tengo un progtwig 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 air?

  2. Digamos que quiero redireccionar HelloWorld2 a test.txt también. No puedo simplemente 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 así como 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 utilizando el método getInputStream() de la instancia del 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) { // ... } } 

Desde JDK 1.5 existe java.lang.ProcessBuilder que también maneja las streams std y err. Es una especie de reemplazo para java.lang.Runtime y deberías estar usándolo.

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