Proceso de salida de apache-commons exec

Estoy en mi ingenio final aquí. Estoy seguro de que esto es algo simple y lo más probable es que tenga grandes agujeros en mi comprensión de Java y las transmisiones. Creo que hay tantas clases que estoy un poco abrumado al tratar de hurgar en la API para descubrir cuándo y cómo quiero usar la multitud de flujos de entrada / salida.

Acabo de enterarme de la existencia de la biblioteca apache commons (autoformación java fail), y actualmente estoy tratando de convertir algunos de mis Runtime.getRuntime (). Exec para usar commons - exec. Ya se corrigió una vez cada 6 meses que este problema surge y luego desaparece con el ejecutiv

El código ejecuta un script perl y muestra el stdout del script en la GUI mientras se ejecuta.

El código de llamada está dentro de un swingworker.

Me estoy perdiendo cómo usar pumpStreamHandler ... de todos modos, aquí está el código anterior:

String pl_cmd = "perl script.pl"
Process p_pl = Runtime.getRuntime().exec( pl_cmd );

BufferedReader br_pl = new BufferedReader( new InputStreamReader( p_pl.getInputStream() ) );

stdout = br_pl.readLine();
while ( stdout != null )
{
    output.displayln( stdout );
    stdout = br_pl.readLine();
}

Supongo que esto es lo que obtengo por copiar el código de pegado que no entiendo completamente hace mucho tiempo. Supongo que lo anterior está ejecutando el proceso, luego toma el flujo de salida (¿a través de "getInputStream"?), Lo coloca en un lector almacenado en búfer, luego se repetirá allí hasta que el búfer esté vacío.

Lo que no entiendo es ¿por qué no hay necesidad de un comando de estilo 'esperar' aquí? ¿No es posible que haya algún tiempo en el que el búfer estará vacío, salga del ciclo y continúe mientras el proceso aún está en curso? Cuando lo ejecuto, este no parece ser el caso.

En cualquier caso, estoy tratando de obtener el mismo comportamiento usando commons exec, básicamente de nuevo desde el código encontrado de google:

DefaultExecuteResultHandler rh = new DefaultExecuteResultHandler();
ExecuteWatchdog wd  = new ExecuteWatchdog( ExecuteWatchdog.INFINITE_TIMEOUT );
Executor exec = new DefaultExecutor();

ByteArrayOutputStream out = new ByteArrayOutputStream();
PumpStreamHandler psh = new PumpStreamHandler( out );

exec.setStreamHandler( psh );
exec.setWatchdog( wd );

exec.execute(cmd, rh );
rh.waitFor();

Estoy tratando de averiguar qué está haciendo pumpstreamhandler. Supongo que esto tomará la salida del objeto exec, y llenará el OutputStream. Lo proporciono con los bytes de stdout / err del script perl?

Si es así, ¿cómo obtendría el comportamiento anterior para que transmita la salida línea por línea? En los ejemplos, la gente muestra que llama al out.toString () al final, y supongo que esto solo me daría un volcado de toda la salida del script una vez que termine de ejecutarse. ¿Cómo lo haría de modo que mostrara el resultado mientras se ejecuta línea por línea?

------------ Edición futura ---------------------

Encontró esto a través de google y funciona bien también:

public static void main(String a[]) throws Exception
{
    ByteArrayOutputStream stdout = new ByteArrayOutputStream();
    PumpStreamHandler psh = new PumpStreamHandler(stdout);
    CommandLine cl = CommandLine.parse("ls -al");
    DefaultExecutor exec = new DefaultExecutor();
    exec.setStreamHandler(psh);
    exec.execute(cl);
    System.out.println(stdout.toString());
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta