gpt4 book ai didi

java - 在进程关闭之前读取所有进程输出

转载 作者:太空宇宙 更新时间:2023-11-04 12:03:08 25 4
gpt4 key购买 nike

我正在使用标准代码读取单独的进程控制台输出:

ProcessBuilder b = new ProcessBuilder(exeArgs);
b.redirectErrorStream(true);
Process process = b.start();
try (BufferedReader inputReader= new BufferedReader(new InputStreamReader(process.getInputStream()))) {
String output;
while ((output = inputReader.readLine()) != null) {
// do something with output
}
}

问题是,如果进程结束的速度比我读取输出的速度快,则部分输出会丢失。

重现该问题的最简单方法是在 try 表达式上放置一个断点,并等待一秒钟,然后再继续执行程序。这样做将阻止您获得任何输出。例如。 inputReader.readLine() 永远不会返回字符串。

有没有办法缓存进程输出以确保它始终被完全读取?

最佳答案

在 Windows 上,控制台缓冲区大小似乎是有限的,您应该尽快读取它,以避免缓冲区溢出并丢失部分数据。在阅读此处的几个答案并阅读有关主题的博客文章后,我发现的唯一可靠的解决方案是尽快在单独的线程中读取控制台输出。

这是在 Kotlin 中实现该任务的简单代码:

typealias GobblerCallback = ((e: String) -> Unit)

class StreamGobbler(private val stream: InputStream, private val lineReadCallback: GobblerCallback? = null) : Thread() {

override fun run() {
try {
val reader = BufferedReader(InputStreamReader(stream, StandardCharsets.UTF_8))
while (true) {
val line = safeReadLine(reader) ?: break
lineReadCallback?.invoke(line)
}
} catch (e: Exception) {
// Handle exception if necessary
}
}

}

// Sample code that reads full process output
val gobbler1 = StreamGobbler(process.inputStream, callback)
gobbler1.start()
val gobbler2 = StreamGobbler(process.errorStream, callback)
gobbler2.start()

关于java - 在进程关闭之前读取所有进程输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40693562/

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