Java での外部コマンドの実行: Runtime.exec() と ProcessBuilder
Java では、開発者には外部コマンドを実行するための 2 つの主なオプションがあります。 : Runtime.exec() および ProcessBuilder.start()。どちらのメソッドも同じ目的を果たしますが、実行プロセスに影響を与える可能性のある微妙な違いがあります。
Runtime.exec()
Runtime.exec() を使用すると、外部コマンドを実行するには、コマンドとその引数を含む単一の文字列または文字列の配列を指定します。例:
Process p = Runtime.getRuntime().exec("command -arg1 -arg2"); p.waitFor();
単一の文字列で Runtime.exec() を使用すると、文字列が引数の配列にトークン化されます。コマンドまたは引数にスペースまたは特殊文字が含まれている場合、このトークン化により予期しない動作が発生する可能性があります。
ProcessBuilder
ProcessBuilder は、コマンド実行プロセスをより詳細に制御できます。コマンドとその引数を配列またはリスト内の個別の文字列として指定する必要があります:
ProcessBuilder b = new ProcessBuilder("command", "-arg1", "-arg2"); Process p = b.start(); p.waitFor();
Runtime.exec() とは異なり、ProcessBuilder は引数をトークン化しないため、コマンドと引数は個別の文字列として提供されます。
の違い動作
2 つのメソッドの主な違いは、オペレーティング システムにコマンドを送信する方法にあります。 Runtime.exec() はトークン化された引数を使用しますが、ProcessBuilder は指定された引数がすでにトークン化されているものと想定しています。
この違いにより、特定の引数の分離が必要なコマンドで ProcessBuilder を使用する場合に問題が発生する可能性があります。たとえば、Windows システムでは、
C:\MyProgram.exe -arg1 -arg2
のようなコマンドは、Runtime.exec() によって単一のコマンドとして認識されますが、各引数を個別に指定しない限り、ProcessBuilder を使用して実行することはできません。
C:\MyProgram.exe" "-arg1" "-arg2"
結論
Runtime.exec() とProcessBuilder は、Java で外部コマンドを効果的に実行できます。ただし、コマンドを正しく実行し、予期しない動作を防ぐには、2 つの方法の微妙な違いを理解することが重要です。迷った場合は、ProcessBuilder を選択すると、コマンド実行プロセスをより詳細に制御でき、引数のトークン化に関する潜在的な問題を回避できます。
以上がRuntime.exec() と ProcessBuilder: Java で外部コマンドを実行するにはどちらが良い方法ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。