2010-07-12 8 views
5

1) Estoy usando Java para llamar terminal de Linux para ejecutar foo.exe y guardar la salida en un archivo:Uso de Java para llamar al terminal Linux: ¿cómo vaciar la salida?

String[] cmd = {"/bin/sh", "-c", "foo >haha.file"}; 
    Runtime.getRuntime().exec(cmd); 

2) El problema es cuando Pienso leer haha.file adelante en el código , no se ha escrito aún:

File f=new File("haha.file"); // return true 
in = new BufferedReader(new FileReader("haha.file")); 
reader=in.readLine(); 
System.out.println(reader);//return null 

3) Sólo después de que el programa se lleva a cabo se escribirá el haha.file. Solo sé cómo limpiar a los "Escritores" pero no sé cómo limpiarlo. Me gusta esto. ¿Cómo puedo forzar a Java a escribir el archivo en la terminal?

Gracias de antemano E.E.

Respuesta

0

Usted puede esperar a la finalización del proceso:

Process p = Runtime.getRuntime().exec(cmd); 
int result = p.waitFor(); 

o utilizar el p.getInputStream() para leer directamente desde la salida estándar del proceso.

2

Este problema está causado por la naturaleza asincrónica de Runtime.exec. foo se está ejecutando en un proceso separado. Debe llamar al Process.waitFor() para asegurarse de que el archivo se haya escrito.

String[] cmd = {"/bin/sh", "-c", "foo >haha.file"}; 
Process process = Runtime.getRuntime().exec(cmd); 
// .... 
if (process.waitFor() == 0) { 
    File f=new File("haha.file"); 
    in = new BufferedReader(new FileReader("haha.file")); 
    reader=in.readLine(); 
    System.out.println(reader); 
} else { 
    //process did not terminate normally 
} 
+1

Tenga cuidado con este enfoque. Hay nasties al acecho con la corriente stdout/stderr cuando se usa exec(). Realmente necesita consumir ASYNCHRONOUSLY las secuencias de salida/error mientras waitFor() está bloqueando, de lo contrario, puede que nunca regrese porque los búferes stdout/err se llenan y bloquean los procesos bifurcados. Checkout apache commons-exec para una lib que resuelve esto. –

Cuestiones relacionadas