2011-01-19 13 views
18

Tengo un programa Test.java:Redirigir Runtime.getRuntime(). Exec() salida con System.setOut();

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"); 
    } 
} 

Esto se supone que imprimir HelloWorld1 y HelloWorld2 a la text.txt archivo. Sin embargo, cuando veo el archivo, solo veo HelloWorld1.

  1. ¿Dónde estaba HelloWorld2? ¿Se desvaneció en el aire?

  2. Digamos que quiero redirigir 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?

+0

¿Es un requisito utilizar Runtime? – Navi

+0

@Navi: ¿Hay una alternativa? Contar. ¡Quiero saber! ¿O quiere usar ProcessBuilder? –

Respuesta

33

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: acceda a la salida estándar del proceso bifurcado, léalo y luego escríbalo. 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) { 
     // ... 
    } 
} 
2

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 a exec() y luego llamar a getOutputStream() desde allí.

5

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

Cuestiones relacionadas