我希望能在Java中打印进程的实时输出,但该输出(几乎)只有当进程停止执行时才可用。
换句话说,当我使用命令行运行相同的进程时,我获得更频繁的反馈(输出),而当我使用Java执行它时,则不是这样。
我测试了以下代码以每250ms打印一次输出:
换句话说,当我使用命令行运行相同的进程时,我获得更频繁的反馈(输出),而当我使用Java执行它时,则不是这样。
我测试了以下代码以每250ms打印一次输出:
private static String printStream(BufferedReader bufferedReader) {
try {
String line = bufferedReader.readLine();
if(line != null) {
System.out.println(line);
}
return line;
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
public static void sendProcessStreams(Process process, SendMessage sendMessage) {
String[] command = { "/bin/bash", "-c", "custom_process"};
ProcessBuilder processBuilder = new ProcessBuilder(command);
processBuilder.directory(new File("."));
Process process = processBuilder.start();
BufferedReader inputBufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()), 1);
BufferedReader errorBufferedReader = new BufferedReader(new InputStreamReader(process.getErrorStream()), 1);
System.out.println("Start reading process");
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
String inputLine = printStream(inputBufferedReader);
String errorLine = printStream(errorBufferedReader);
if(inputLine == null && errorLine == null && !process.isAlive()) {
timer.cancel();
}
}
}, 0, 250);
}
然而它只打印两行,然后等待进程结束之前再打印其余内容。
是否有可能从外部进程获得更频繁的反馈?如果不能,为什么?
InputStreamReader
吗?如果你想要实时操作,为什么要进行缓冲呢? - MaltBufferedReader
,因为文档中说“为了最高效率,请考虑在 BufferedReader 中包装 InputStreamReader。”;我尝试使用了较小的缓冲区大小... 但我对此并不自信,希望文档能提供更多信息。谢谢! 我没有尝试使用redirectOutput
,因为我希望通过 WebSocket 发送流,而不是标准输出。 - arthur.sw