gpt4 book ai didi

java - 使用java实时获取流程输出

转载 作者:行者123 更新时间:2023-11-30 01:45:16 24 4
gpt4 key购买 nike

我想用java打印进程的实时输出;但输出(几乎)仅在进程停止执行时可用。

换句话说,当我使用命令行运行相同的进程时,我得到的反馈(输出)比使用 Java 执行时更频繁。

我测试了以下代码,每 250 毫秒打印一次输出:

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);
}

但它只打印两行,然后等待进程结束后再打印其他内容。

是否可以从外部流程获得更频繁的反馈?如果没有,为什么不呢?

最佳答案

您的代码基本上(就从输出中读取而言)工作正常,问题肯定是出于其他原因,请构建一个可重现的最小问题(例如,什么是 custom_process,为什么您当您可以使用当前线程时,请使用Timer,...)。

无论如何,这是一个实时读取输出的示例:

final Process proc = new ProcessBuilder(
"/bin/bash", "-c",
"for i in `seq 1 10`; do echo $i; sleep $((i % 2)); done")
.start();
try(InputStreamReader isr = new InputStreamReader(proc.getInputStream())) {
int c;
while((c = isr.read()) >= 0) {
System.out.print((char) c);
System.out.flush();
}
}

输出:

1         (and wait one second)
2
3 (and wait one second)
4
5 (and wait one second)
6
7 (and wait one second)
8
9 (and wait one second)
10

关于java - 使用java实时获取流程输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58272702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com