gpt4 book ai didi

java - 用 Java 流畅地读取进程的输出

转载 作者:太空宇宙 更新时间:2023-11-04 07:24:17 24 4
gpt4 key购买 nike

在java中,我试图读取我用C编写的控制台程序的输出。该程序使用 printf() 不断地将其当前进度打印到 stdout 中。如果我在控制台中运行该程序,一切都很好,我会看到输出。我现在尝试从 java 内部运行它,它也运行良好,该过程正在启动和计算,但是整个输出将立即以大块的形式读取(几秒钟内没有输出,然后所有内容都会立即出现)。

我假设之间存在某种必须填充的缓冲区。

为了绘制进度条并使用程序打印的其他参数,有必要从标准输出流畅地读取而不是一次读取所有内容。

我已经在类似 Problem reading InputStream from Java Process (Runtime.getRuntime().exec() or ProcessBuilder) 的问题中读到过这一点。 ,但这对我没有多大帮助,因为我遵循了这些问题中的提示。

下面是我当前尝试使用的代码。

public static void main(String[] args)
{
ProcessBuilder builder = new ProcessBuilder("render.exe", "1920", "1080", "10000", "0", "0", "1", "6", "test.png");
try
{
final Process proc = builder.start();
final Thread io = new Thread()
{
@Override
public void run()
{
final InputStream read = proc.getInputStream();
int c;
try
{
while((c = read.read()) != -1)
System.out.print((char)c);
}
catch (IOException e)
{
e.printStackTrace();
}
}
};
io.start();
proc.waitFor();
}
catch (IOException | InterruptedException e)
{
e.printStackTrace();
}

}

最佳答案

C 程序可能检测到其标准输出未连接到交互式控制台并缓冲其输出;您无法从 Java 更改此设置。

假设您使用 stdio,为了使 C 程序更流畅地生成输出,您可以在适当的位置添加 fflush(stdout),或者您可以通过调用 setvbuf 禁用缓冲:

setvbuf(stdout, NULL, _IONBF, 0);

关于java - 用 Java 流畅地读取进程的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18811225/

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