【问题标题】:Read the output of a process fluidly in Java在 Java 中流畅地读取进程的输出
【发布时间】:2013-09-19 14:40:55
【问题描述】:

在 java 中,我试图读取我用 C 编写的控制台程序的输出。 该程序使用 printf() 不断地将其当前进度打印到标准输出中。 如果我在控制台中运行该程序,一切都很好,我看到了输出。 我现在正在尝试从 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();
    }

}

【问题讨论】:

    标签: java process inputstream


    【解决方案1】:

    C 程序可能检测到它的标准输出没有连接到交互式控制台并缓冲它的输出;你不能从 Java 中改变它。

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

    setvbuf(stdout, NULL, _IONBF, 0);
    

    【讨论】:

    • 有与此等价的普通 C 语言吗?
    • 这些函数是在C stdio中定义的,你说的“普通C等价物”是什么意思?
    • 对不起,我的错误 :D 我刚读了“stdout”并立即想到了 c++
    • _IONBUF 在哪里声明?我包括了 stdio,但它没有声明
    • 抱歉,打错了,是_IONBF
    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多