0

いくつかのデータを出力する C++ プログラム (feeder.exe) があります。

printf("%s\n", line);

平均して 1 秒あたり 20 ~ 30 行を生成しますが、均一ではありません。

Javaコードからexeを実行して、Javaプログラムでこのデータをキャッチしたい:

package temp_read;    
import java.io.*;
public class Main {

    public static void main(String[] args) throws Throwable {
        Process p = Runtime.getRuntime().exec("d:/feeder.exe");
        InputStream is = p.getInputStream();
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        String line = null;
        while ((line = in.readLine()) != null) {
            System.out.println(System.currentTimeMillis() + "," + line);
        }
    }
}

しかし、出力を調べると、3 ~ 5 秒に 1 回、大量の文字列を受け取っていることがわかります。

質問: feeder.exe から stdout に出力するときに遅延なくすぐにデータを受け取るにはどうすればよいですか?

PS: 関係ない質問: Ctrl+C で Java を停止した場合、feeder.exe を停止するにはどうすればよいですか?

4

2 に答える 2

2

リダイレクトされた場合、stdout はおそらくバッファリングされます。これは、問題が C++ コードにあり、Java 側にないことを意味します。C++ プロセスは出力をバッファリングし、バッファがいっぱいになるとすぐに複数の「printf」を一度にフラッシュします。

C++ ソフトウェアを変更できる場合はfflush(stdout);、printf の後に a を実行して、出力バッファーを強制的にフラッシュしてみてください。

于 2013-04-17T15:16:26.210 に答える