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

用Java流畅地读取进程的输出,java,process,inputstream,Java,Process,Inputstream,在java中,我试图读取我用C编写的控制台程序的输出。 此程序正在使用printf()将其当前进度连续打印到标准输出中。 如果我在控制台中运行该程序,一切正常,我看到了输出。 我现在尝试从java内部运行它,java也运行良好,进程正在启动和计算,但是整个输出将立即以巨大的块读取(几秒钟内没有输出,然后所有内容立即显示) 我想在这两者之间一定有某种缓冲区需要填补 为了绘制进度条并处理程序正在打印的其他参数,必须流畅地从标准输出读取数据,而不是一次读取所有数据 我已经在类似的问题中读到了这一点,但

在java中,我试图读取我用C编写的控制台程序的输出。 此程序正在使用printf()将其当前进度连续打印到标准输出中。 如果我在控制台中运行该程序,一切正常,我看到了输出。 我现在尝试从java内部运行它,java也运行良好,进程正在启动和计算,但是整个输出将立即以巨大的块读取(几秒钟内没有输出,然后所有内容立即显示)

我想在这两者之间一定有某种缓冲区需要填补

为了绘制进度条并处理程序正在打印的其他参数,必须流畅地从标准输出读取数据,而不是一次读取所有数据

我已经在类似的问题中读到了这一点,但这对我帮助不大,因为我遵循了这些问题中的提示

下面是我目前正在尝试使用的代码

publicstaticvoidmain(字符串[]args)
{
ProcessBuilder=newProcessBuilder(“render.exe”、“1920”、“1080”、“10000”、“0”、“0”、“1”、“6”、“test.png”);
尝试
{
最终过程proc=builder.start();
最终线程io=新线程()
{
@凌驾
公开募捐
{
最终InputStream read=proc.getInputStream();
INTC;
尝试
{
而((c=read.read())!=-1)
系统输出打印((字符)c);
}
捕获(IOE异常)
{
e、 printStackTrace();
}
}
};
io.start();
进程waitFor();
}
捕获(IOException | InterruptedException e)
{
e、 printStackTrace();
}
}

C程序可能检测到其标准输出未连接到交互式控制台,并缓冲其输出;您不能从Java中更改它

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

setvbuf(stdout, NULL, _IONBF, 0);

C程序可能检测到其标准输出未连接到交互控制台,并缓冲其输出;您不能从Java中更改它

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

setvbuf(stdout, NULL, _IONBF, 0);

有一个普通的C等价物吗?这些函数是在C stdio中定义的,你说的“普通C等价物”是什么意思?对不起,我的错误是:我刚刚读了“stdout”,立刻想到了C++在哪里声明了?我包括了stdio,但它没有声明对不起,这里有一个输入错误,它是
\u IONBF
有一个普通的C等价物吗?这些函数是在C stdio中定义的,你说的“普通的C等价物”是什么意思?对不起,我的错误:我刚刚读了“stdout”,马上想到了C++在哪里声明的?我包括了stdio,但它没有声明对不起,那里有一个打字错误,它是
\u IONBF