0

java プログラムで、centOS マシンで使用する sh スクリプトを生成しています。これは sox と lame を使用して MP3 オーディオ ファイルをデコードし、それぞれファイルにゲインを適用します。Process.waitFor() メソッドが無期限にハングする以外のことを行うのに問題があります。コードは次のとおりです。

            try
    {
    // TODO code application logic here
        String reviewPath = "/SomeDirectory/";
        String fileName = "FileName";
        String extension = ".mp3";
        StringBuilder sb = new StringBuilder();
        sb.append("#!/bin/bash\n");
        sb.append("cd " + reviewPath + "\n");
        sb.append("lame --decode " + fileName + extension + "\n"); 
        File script = new File(reviewPath + fileName + ".sh");
        script.createNewFile();
        script.setExecutable(true);
        FileWriter writer = new FileWriter(script);
        writer.write(sb.toString());
        writer.close();
        Process p = Runtime.getRuntime().exec(script.getAbsolutePath());
        String line;
        BufferedReader bri = new BufferedReader
            (new InputStreamReader(p.getInputStream()));
        BufferedReader bre = new BufferedReader
            (new InputStreamReader(p.getErrorStream()));
        while ((line = bri.readLine()) != null) {
            System.out.println(line);
        }
        bri.close();
        while ((line = bre.readLine()) != null) {
            System.out.println(line);
        }
        bre.close();
        p.waitFor();
        System.out.println("Done.");

    }
    catch (Exception e)
    {
        System.out.println(e.getMessage());
    }

奇妙な点は、手動で生成した .sh ファイルを実行すると、正常に実行および終了しますが、Java のプロセス オブジェクトから実行すると、決して終了しないことです。プロセスの exitValue は常に「プロセスは終了していません」です。set -e をスクリプトに追加して、スクリプトの最後まで終了しようとしました。kill コマンドを使用しないと (ここで実行できるとは思いません)、ここで何が起こっているのか途方に暮れています。助言がありますか?

4

2 に答える 2

0

私はそれを考え出した!ここでの問題は、実際には、アプリケーションを終了するために出力ストリームをフラッシュする必要があることでしたが、単にストリームから読み取るだけでは十分ではありません。Suresh Koya の提案を使用し、processBuilder API を使用し、プロセスを開始する前にプロセスのエラー ストリームをリダイレクトし、ストリームから読み取りました。これにより、私が抱えていた問題が修正されました:D

于 2012-11-21T21:09:53.897 に答える
0

プロセスを開始した後に何かを追加while(p.getInputStream().read() != -1);します。バッファーがいっぱいになり、プロセスは何か (この場合はプログラム) を読み取ってスペースを解放するのを待機しなくなります。

于 2012-11-21T20:29:39.437 に答える