ProcessBuilder と Runtime.exec() の違いを理解する
Java コードから外部コマンドを実行する場合、開発者はよく次の 2 つの一般的な方法に遭遇します。 Runtime.getRuntime().exec(...) および新しい ProcessBuilder(...).start()。これらのメソッドは似ているように見えますが、コマンドの実行に影響を与える可能性のある重要な違いがあります。
オーバーロードとトークン化
Runtime.exec() は、単一文字列と配列のオーバーロード。単一文字列のオーバーロードを使用する場合、指定された文字列は引数の配列にトークン化されます。このトークン化動作は ProcessBuilder には適用されません。 ProcessBuilder コンストラクターは、各文字列が個別の引数を表すと仮定して、可変引数配列または文字列のリストのみを受け入れます。
コマンド実行への影響
この違いを例で説明してみましょう。 Windows では、次の Runtime.exec() 呼び出し:
Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");
は、引数 "-arg1" および "-arg2" を指定して "DoStuff.exe" プログラムを実行します。トークン化により、コマンドが適切に解析されることが保証されます。
対照的に、「DoStuff.exe -arg1 -arg2」という名前のプログラムが C: ディレクトリに存在しない限り、次の ProcessBuilder の呼び出しは失敗します。
ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2");
ProcessBuilder を使用してコマンドを正しく実行するには、引数を指定する必要があります。個別に:
ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2");
またはリストを使用:
List<String> params = java.util.Arrays.asList("C:\DoStuff.exe", "-arg1", "-arg2"); ProcessBuilder b = new ProcessBuilder(params);
エラー処理への影響
コマンドのトークン化の違いはエラー処理に影響を与える可能性があります。たとえば、ProcessBuilder が指定されたプログラムの検索に失敗した場合、予期される終了値 0 ではなく、エラー コード 1001 が返されることがあります。このようなエラーをデバッグするには、Runtime.exec() と ProcessBuilder のトークン化動作を理解することが重要です。
以上がProcessBuilder と Runtime.exec(): 外部コマンドの実行にどちらを使用する場合?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。