2

作成中の Java アプリで Handbrake を実行しようとしていますが、Handbrake が完了するのを待つのに問題があります。

これを試すと:

        ProcessBuilder builder = new ProcessBuilder(
                "cmd.exe", "/c", command);
        Process p = builder.start();

        BufferedReader inputreader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;
        while((line = inputreader.readLine()) != null)
        {
            System.out.println(line);
        }

私が得る出力は次のとおりです。

Encoding: task 1 of 1, 0.00 %

何度も何度もファイルが変換されません。

次のように変更すると:

        BufferedReader inputreader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        BufferedReader errorreader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        String line = null;
        String line2 = null;
        while((line = inputreader.readLine()) != null && (line2 = errorreader.readLine()) != null)
        {
            System.out.println(line);
            System.out.println(line2);
        }

私のテストファイルでは動作しますが、errorreader が読み取る行を使い果たし、readLine() がスレッドを無限にロックするとハングアップします。完全な長さのファイルでは、ファイルは変換されますが、コードのこの部分はロックされるため、アプリケーションを続行できません。

助言がありますか?

4

1 に答える 1

3

プロセスを作成する前に呼び出しbuilder.redirectErrorStream(true);(これにより、入力ストリームとエラー ストリームが 1 つ (入力ストリーム) にマージされます)、InputStream からのみ読み取ります。

これにより、入力ストリームの前にエラーストリームのデータが不足するという問題が解決するはずです。

それらを別々に保持したい場合は、2 つのスレッドを開始して、入力ストリームから読み取り、1 つをエラー ストリームから読み取ることができます。

于 2015-06-12T02:17:29.533 に答える