在java中,我试图读取我在C中编写的控制台程序的输出。 该程序使用printf()不断将其当前进度打印到stdout。 如果我在控制台中运行该程序,一切都很好,我看到输出。 我现在正试图从java内部运行它,它也运行良好,进程正在启动和计算,但是整个输出将立即以大块读取(几秒钟内没有输出,然后一切都出现在)。
我认为介于两者之间的某种缓冲区必须填充。
为了绘制一个进度条并使用其他参数,程序正在打印,需要从stdout流畅地读取,而不是一次性读取。
我已经在像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();
}
}
答案 0 :(得分:1)
C程序可能检测到它的stdout没有连接到交互式控制台并缓冲其输出;你不能用Java改变它。
假设您使用stdio,为了使C程序更流畅地生成输出,您可以在适当的位置添加fflush(stdout)
,或者您可以通过调用setvbuf
来禁用缓冲:
setvbuf(stdout, NULL, _IONBF, 0);