この記事の例では、Java によって呼び出される外部プログラムをランタイムに基づいてブロックする解決策について説明します。これは非常に実用的な手法です。皆さんの参考に共有してください。具体的な分析は次のとおりです。
場合によっては、swf を変換する SwfTools、ビデオを変換する ffmpeg などの外部プログラムが Java コードで呼び出されることがあります。コードが Runtime.getRuntime().exec(command) のように記述されている場合、プログラムはすぐに実行されますが、Java はコマンドの実行を待機しないため、コマンドラインでの実行には時間がかかります。外部プログラムが完了するには、ブロックを使用して外部プログラムの実行結果を待つ必要があります。
InputStream stderr = process.getInputStream();InputStreamReader isr = new InputStreamReader(stderr, "GBK");BufferedReader br = new BufferedReader(isr);String line = null;while ((line = br.readLine()) != null ) System.out.println(line);int exitValue = process.waitFor();
一般的な外部プログラムの場合、少なくとも pdf2swf.exe では上記のブロック コードを使用できます。
しかし、その後、ffmpeg の場合、上記のコードによりプログラムが停止するため、次のようにメソッドにカプセル化する別のメソッドを使用する必要があることがわかりました。
@SuppressWarnings("static-access")public static int doWaitFor(Process process) { InputStream in = null; InputStream err = null; int exitValue = -1; p が終了すると呼び出し元に返されます try { in = process.getInputStream (); err = process.getErrorStream(); // p が終了すると true に設定されます。 (in.available() > 0) { // システムコールの出力を出力します Character c = new Character((char) in.read()) } while (err.available () > 0) { // システムコールの出力を出力します Character c = new Character((char) err.read()); System.out.print(c); } // プロセスに exitValue を問い合わせます。 // 処理が完了していない場合は、 IllegalThreadStateException // 終了した場合は失敗し、 // 変数 completed が true に設定されます。 exitValue = process.exitValue(); completed = true } catch (IllegalThreadStateException e) { // プロセスは終了しません。まだ終了しています; // CPU サイクルを節約するために少しスリープします Thread.currentThread().sleep(500) } } } catch (Exception e) { e.printStackTrace(); } 最後に { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace() } if (err != null) err.close(); } catch (IOException e) { e.printStackTrace() } } 戻り値; }この記事で説明した内容が、皆さんの Java プログラミングの学習に役立つことを願っています。