1

Java で、C で記述したコンソール プログラムからの出力を読み込もうとしています。このプログラムは、printf() を使用して現在の進行状況を stdout に継続的に出力しています。そのプログラムをコンソールで実行すると、すべて問題なく、出力が表示されます。私は今、Java内から実行しようとしていますが、これも正常に実行され、プロセスが開始され計算されていますが、出力全体が一度に巨大なブロックで読み取られます(数秒間出力がなく、すべてが一度に表示されます) )。

その間に、埋めなければならないある種のバッファがあると思います。

プログレスバーを描画し、プログラムが印刷している他のパラメーターを操作するには、すべてを一度にではなく、標準出力から流動的に読み取る必要があります。

Java プロセスからの InputStream の読み取りに関する問題 (Runtime.getRuntime().exec() または 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();
    }

}
4

1 に答える 1

1

C プログラムはおそらく、その stdout が対話型コンソールに接続されていないことを検出し、その出力をバッファーに入れます。これを Java から変更することはできません。

stdio を使用すると仮定すると、C プログラムが出力をより滑らかに生成するようにするにはfflush(stdout)、適切な場所に追加するか、次の呼び出しでバッファリングを無効にすることができますsetvbuf

setvbuf(stdout, NULL, _IONBF, 0);
于 2013-09-15T10:30:30.517 に答える