ProcessBuilder と Runtime.exec(): 違いを理解する
Java から外部コマンドを実行しようとすると、開発者は多くの場合、矛盾に遭遇します。 Runtime.exec() と ProcessBuilder.start() の間の動作。
Runtime.exec():
Runtime.getRuntime().exec() の使用には、トークン化と実行の 2 段階のプロセス。入力文字列は実行前に解析され、引数の配列に変換されます。
ProcessBuilder:
対照的に、ProcessBuilder の動作は異なります。そのコンストラクターは、可変引数配列または文字列のリストを受け入れます。各文字列は個々の引数を表します。次に、引数は 1 つの文字列に結合され、オペレーティング システムに渡されます。
実行への影響:
この引数処理の違いは、指示。たとえば、コマンドにスペースが含まれている場合、Runtime.exec() は自動的にトークン化を処理しますが、ProcessBuilder では引数の配列またはリストを明示的に作成する必要があります。
例:
スペースを含む次のコマンドを考えてみましょう:
"C:\DoStuff.exe -arg1 -arg2"
Using Runtime.exec():
Process p = Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");
この場合、コマンドは意図したとおりに実行されます。
Using ProcessBuilder:
Process p = (new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2")).start();
ただし、トークン化せずに直接 ProcessBuilder を使用すると、エラーまたは予期しない動作が発生し、 exitValue は 1001 です。これを修正するには、引数配列を明示的に作成する必要があります:
Process p = (new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2")).start();
概要:
一般に、ProcessBuilder を使用する場合は、以下を提供することが不可欠です。引数は個別のリストまたは配列として、個々の引数を明示的に示します。この追加手順により、引数が正しく解析され、外部コマンドが意図したとおりに実行されることが保証されます。
以上がRuntime.exec() と ProcessBuilder.start(): それぞれをいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。