Java では、
Runtime クラス
またはProcessBuilder クラス
を通じて外部プログラムを呼び出すことができます。
Runtime クラスの使用:
Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("外部程序路径");
ProcessBuilder クラスの使用:
ProcessBuilder builder = new ProcessBuilder("外部程序路径"); Process process = builder.start();
上記の 2 つの方法は両方とも、外部プロセスを開始できます。外部プロセスにパラメーターを渡す必要がある場合は、exec() または ProcessBuilder コンストラクターで文字列配列を渡すことができます。
String[] cmdarray = {"外部程序路径", "参数1", "参数2"};Process process = runtime.exec(cmdarray);
戻り結果外部プロセスにプロセスオブジェクトの取得を渡すことができます。 getInputStream() メソッドを使用して外部プロセスの標準出力ストリームを読み取ることも、getErrorStream() メソッドを使用してエラー出力ストリームを読み取ることもできます。
InputStream inputStream = process.getInputStream(); // 标准输出流 InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String line; while ((line = bufferedReader.readLine()) != null) { System.out.println(line); // 输出每行结果 }
注
: 外部プログラムを呼び出す場合は、セキュリティ上の問題やシステムクラッシュなどの異常事態が発生する可能性があるため、注意してください。この機能を使用する場合は、外部プログラムを十分にテストして検証することをお勧めします
@Test public void runtimeTest() { try { //获取执行进程 Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("ipconfig"); //读取输入流 InputStream inputStream = process.getInputStream(); //将字节流转成字符流 InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "gbk"); //字符缓冲区 char[] c = new char[1024]; int len = -1; while ((len = inputStreamReader.read(c)) != -1) { String s = new String(c, 0, len); System.out.print(s); } inputStream.close(); inputStreamReader.close(); //阻塞当前线程,直到进程退出为止 process.waitFor(); int exitValue = process.exitValue(); if (exitValue == 0) { System.out.println("进程正常结束"); } else { System.out.println("进程异常结束"); } } catch (Exception e) { e.printStackTrace(); } }
#ProcessBuilder クラスの使用
@Test public void processBuilderTest1() { ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.command("java"); //将标准输入流和错误输入流合并,通过标准输入流读取信息 processBuilder.redirectErrorStream(true); try { //启动进程 Process start = processBuilder.start(); //获取输入流 InputStream inputStream = start.getInputStream(); //转成字符输入流 InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "gbk"); int len = -1; //字符缓冲区 char[] c = new char[1024]; //读取进程输入流中的内容 while ((len = inputStreamReader.read(c)) !=-1){ String s = new String(c, 0, len); System.out.print(s); } inputStreamReader.close(); inputStream.close(); //阻塞当前线程,直到进程退出为止 start.waitFor(); int exitValue = start.exitValue(); if (exitValue == 0) { System.out.println("进程正常结束"); } else { System.out.println("进程异常结束"); } } catch (IOException e) { e.printStackTrace(); } }
##単純なパラメータの呼び出し
processBuilder.command("java","-version");
複雑なパラメータの呼び出し
List<String> command = new ArrayList<>(); command.add("java"); command.add("-version"); processBuilder.command(command);Apache Commons Exec ライブラリ
#使用手順の概要1. 依存関係を追加し、Apache Commons Exec ライブラリをプロジェクトに追加します
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-exec</artifactId> <version>1.3</version> </dependency>
CommandLine cmdLine = CommandLine.parse("command argument1 argument2");
は次のように書き換えることができます。 executor オブジェクトを作成するには、DefaultExecutor オブジェクトを使用する必要があり、作業ディレクトリは必要に応じて設定できます。
DefaultExecutor executor = new DefaultExecutor(); executor.setWorkingDirectory(new File("/your/workdir"));
4. プロセッサ オブジェクトの作成: PumpStreamHandler オブジェクトは、入力ストリームと出力ストリームを処理し、プロセスの標準出力と標準エラー情報を保存できます。
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream); executor.setStreamHandler(streamHandler);
executor.execute メソッドを呼び出してコマンドを実行し、プロセスが終了するのを待ちます。 process.waitFor() を呼び出して、プロセスが完了するのを待ってから、対応する操作の実行を続行します。実行が完了すると、outputStream の出力結果が処理されます。
executor.execute(cmdLine); String output = outputStream.toString("UTF-8"); System.out.println(output);
使用例
public static void main(String[] args) throws IOException { CommandLine cmdLine = CommandLine.parse("java -version"); DefaultExecutor executor = new DefaultExecutor(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream); executor.setStreamHandler(streamHandler); executor.execute(cmdLine); String output = outputStream.toString("UTF-8"); System.out.println(output); }
実行出力結果:
java バージョン "1.8.0_271"Java(TM) SE 実行環境 (ビルド 1.8.0.0) 0_271-b09)
Java HotSpot(TM) 64 ビット サーバー VM (ビルド 25.271-b09、混合モード)以上がJavaで外部プログラムを呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。