Runtime.exec() と ProcessBuilder.start(): それぞれをいつ使用する必要がありますか?

Susan Sarandon
リリース: 2024-11-13 15:22:02
オリジナル
759 人が閲覧しました

Runtime.exec() vs. ProcessBuilder.start(): When Should I Use Each?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート