Lectura de streams desde java Runtime.exec

Tengo el siguiente fragmento de código:

Process proc = runtime.exec(command); errorGobbler = new ErrorStreamGobbler(proc.getErrorStream(), logErrors, mdcMap); outputGobbler = new OutputStreamGobbler(proc.getInputStream(), mdcMap); executor.execute(errorGobbler); executor.execute(outputGobbler); processExitCode = proc.waitFor(); 

donde los gobblers son Runnable s que usan un BufferedReader para leer los flujos de entrada y error del proceso de ejecución. Si bien esto funciona la mayor parte del tiempo, obtengo la ventana ocasional (de aproximadamente 2 minutos aproximadamente) donde obtengo el processExitCode como 0, que indica la terminación normal pero no hay nada en las secuencias de entrada y error, nada que indique siquiera el final. of-stream.

Como indiqué antes, esto funciona la mayor parte del tiempo, pero esta falla ocurre de vez en cuando, y estoy totalmente desconcertado. ¿Algunas ideas?

Harapos

He luchado con el mismo tipo de problemas. No puedo recordar qué fue exactamente lo que estuvo mal (tal vez olvidé enjuagar / cerrar las transmisiones correctamente o algo así …). De todos modos, esto es lo que se me ocurrió.

 /** * Handle communication with a process, reading its output/error and feeding its input * @param process The process to execute * @param _in Reader that will feed the input pipe of the process * @param out Writer that will receive the output of the process * @param err Writer that will receive the error pipe of the process */ public static void communicate( Process process, final Reader _in, final Writer out, final Writer err) { // Buffer the input reader final BufferedReader in = new BufferedReader(_in); // Final versions of the the params, to be used within the threads final BufferedReader stdOut = new BufferedReader(new InputStreamReader(process.getInputStream())); final BufferedReader stdErr = new BufferedReader(new InputStreamReader(process.getErrorStream())); final BufferedWriter stdIn = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); // Thread that reads std out and feeds the writer given in input new Thread() { @Override public void run() { String line; try { while ((line = stdOut.readLine()) != null) { out.write(line + newline); } } catch (Exception e) {throw new Error(e);} try { out.flush(); out.close(); } catch (IOException e) { /* Who cares ?*/ } } }.start(); // Starts now // Thread that reads std err and feeds the writer given in input new Thread() { @Override public void run() { String line; try { while ((line = stdErr.readLine()) != null) { err.write(line + newline); } } catch (Exception e) {throw new Error(e);} try { err.flush(); err.close(); } catch (IOException e) { /* Who cares ?*/ } } }.start(); // Starts now // Thread that reads the std in given in input and that feeds the input of the process new Thread() { @Override public void run() { String line; try { while ((line = in.readLine()) != null) { stdIn.write(line + newline); } } catch (Exception e) {throw new Error(e);} try { stdIn.flush(); stdIn.close(); } catch (IOException e) { /* Who cares ?*/ } } }.start(); // Starts now // Wait until the end of the process try { process.waitFor(); } catch (Exception e) { throw new Error(e); } } // End of #communicate 

Espero que esto ayude.