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.
¿A dónde fue HelloWorld2? ¿Se desvaneció en el aire?
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í.