[英]Reading streams from java Runtime.exec
I have the following snippet of code: 我有以下代码片段:
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();
where the gobblers are Runnable
s which use a BufferedReader
to read the input and error streams of the executing process. gobblers是Runnable
的,它使用BufferedReader
来读取执行进程的输入和错误流。 While this works most of the time, I get the occasional window (of about 2 minutes or so) where I get the processExitCode
as 0, which indicates normal termination but there is nothing in the input and error streams - nothing to even indicate end-of-stream. 虽然这大部分时间都有效,但我偶尔会看到窗口(大约2分钟左右),我将processExitCode
设为0,这表示正常终止,但输入和错误流中没有任何内容 - 甚至没有任何内容表示 -的流。
Like I indicated before, this works most of the time but this failure occurs every once in a while - and I am totally puzzled. 就像我之前说过的那样,这种情况大部分时间都有效,但这种失败每隔一段时间就会发生 - 我完全感到困惑。 Any ideas? 有任何想法吗?
Rags 碎布
I've struggled with the same kind of issues. 我一直在努力解决同样的问题。 I can't remember what exactly was wrong (maybe I forgot to flush / close the streams correctly or something ...). 我不记得到底出了什么问题(也许我忘了正确地冲洗/关闭流或什么......)。 Anyway, here is what I came up with. 无论如何,这就是我想出的。
/**
* 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
I hope this helps. 我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.