在Java中执行除了Java之外的指令

使用的类和方法

java.lang.Runtime#exec可以被解释为执行操作。

用返回的java.lang.Process对象来处理结果。

代码示例 (Code example)

Process proc = Runtime.getRuntime().exec( "java --version" );

这是一个实施的例子

jshell> Process proc = Runtime.getRuntime().exec( "java --version" );
proc ==> Process[pid=19916, exitValue="not exited"]

jshell> proc.exitValue();
$2 ==> 0

输入输出

注意到方法名是从执行Process#exec的方面来看的。

从执行过程中的输出

    • Process#getInputStream

 

    •  → Process#execで実行したプロセスが標準出力に出力する内容を取得するためのInputStreamを取得

 

    <ソースコード例>
import java.io.*;

Process proc = Runtime.getRuntime().exec( "java Hello" );
String line = null;

try ( var buf = new BufferedReader( new InputStreamReader( proc.getInputStream() ) ) ) {
  while( ( line = buf.readLine() ) != null ) System.out.println( line );
}

# Hello.javaの内容
public class Hello {
    public static void main( String[] args ) {
        System.out.println( "Hello, world!!" );
    }
}

以下是<結果>的中文翻譯:

Hello, world!!
    • Process#getErrorStream

 

    •  → Process#execで実行したプロセスが標準エラー出力に出力する内容を取得するための

 

      InputStreamを取得

以下是一个源代码的示例:

假设NotExist.java并不存在。


import java.io.*;

Process proc = Runtime.getRuntime().exec( "javac NotExist.java" );
String line = null;

try ( var buf = new BufferedReader( new InputStreamReader( proc.getErrorStream() ) ) ) {
  while( ( line = buf.readLine() ) != null ) System.out.println( line );
}

<结果> – (The result)

エラー: ファイルが見つかりません: NotExist.java
使用方法: javac <options> <source files>
使用可能なオプションのリストについては、--helpを使用します

向执行进程的输入

    • Process#getOutputStream

 

    •  → Process#execで実行したプロセスの標準入力へ情報を渡すためのOutputStreamを取得

 

    <ソースコード例>

import java.io.*;

Process proc = Runtime.getRuntime().exec( "java -cp . SampleCode" );

try ( var buf = new BufferedWriter( new OutputStreamWriter( proc.getOutputStream() ) ) ) {
     buf.write( "3" );
     buf.newLine();
     buf.write( "5" );
     buf.newLine();
}

// 取得したプロセスからの出力内容を表示
try ( var buf = new BufferedReader( new InputStreamReader( proc.getInputStream() ) ) ) {
   while( ( line = buf.readLine() ) != null ) System.out.println( line );
}

// SampleCode.javaの内容
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class SampleCode {
    public static void main( String[] args ) throws Exception{
        try ( var buf = new BufferedReader(
                new InputStreamReader( System.in )
                ) ) {
            int x = Integer.parseInt( buf.readLine() );
            int y = Integer.parseInt( buf.readLine() );

            System.out.println( x + "*" + y + "=" + x*y );
        }
    }
}

<结果>
结果

3*5=15

其他

    • プロセスの完了を待機する場合は、Process#waitForを実行。

 

    • プロセスの終了コードは、Process#exitValueで取得可能。

 

    ただし、プロセスが終了していない状態でexitValueを呼ぶと例外(java.lang.IllegalThreadStateException)が発生する。(下記参照)
Exception in thread "main" java.lang.IllegalThreadStateException: process has not exited
  at java.base/java.lang.ProcessImpl.exitValue(ProcessImpl.java:478)
广告
将在 10 秒后关闭
bannerAds