Java からコマンドを実行 - Runtime クラスの利用 -
技術情報 TOP へ

本ページでの使用環境
OS:Windows XP SP 2
Java:JDK 5.0 UPDATE 8
ここでは、Java からコマンドを実行する簡単なサンプルを記述いたします。

Java が初めての方は、まずは、基本的な Java プログラム - 簡単な文字列の表示、数値の計算 -をご参照ください。





Java からコマンドを実行するには、Runtime#getRuntime().exec メソッドを利用します。 この時、以下のサンプルのようにサブスレッドを使用して、Process#getInputStream() 及び Process#getErrorStream() から実行し標準出力とエラー出力を吸収する必要があります。
( これを行わないとサブプロセスはブロックもしくはデッドロックされる可能性があります。 )

以下の RuntimeSample.java では例として "java -version" コマンドを実行しています。

ファイル名:RuntimeSample.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

public class RuntimeSample {
	
  	private InputStream in = null;   	
  	
  	private InputStream ein = null;
  	
  	private OutputStream out = null;
  	
  	private BufferedReader br = null;
  	
  	private BufferedReader ebr = null;
	
  	private Process process = null;
	
  	private String line = null;
	
  	private String errLine = null;
	
  	private Thread stdRun  = null;
    
  	private Thread errRun  = null;    
    

  public RuntimeSample() {	
  }	
	
  private void execCmd() throws IOException, InterruptedException{	 
		
	String[] cmd = {"java","-version"};
	
	process = Runtime.getRuntime().exec(cmd);
	
	/* 1 サブプロセスの入力ストリームを取得 */
	in = process.getInputStream(); 
	
	/* 2 サブプロセスのエラーストリームを取得 */
	ein = process.getErrorStream();
	
	/* 3 サブプロセスの出力ストリームを取得 ここでは使用しません。*/
	out = process.getOutputStream();
	
	/* 上記の3つのストリームは finally でクローズします。 */
			
	try {
	/*上記 1 のストリームを別スレッドで出力します。*/
	Runnable inputStreamThread = new Runnable(){
	  public void run(){		
	  	try {
	  	  System.out.println("Thread stdRun start");
	  	br = 
	  	  new BufferedReader(new InputStreamReader(in));
	  	while ((line = br.readLine()) != null) {
	  	  System.out.println(line);
	  	}
	  	System.out.println("Thread stdRun end");
	  	} catch (Exception e) {		
	  	  e.printStackTrace();      	
	 	}
	  }
	};
		
	/*上記 2 のストリームを別スレッドで出力*/
	Runnable errStreamThread = new Runnable(){
	  public void run(){		
	  	try {
	  	  System.out.println("Thread errRun start");
	  	ebr =
	  	  new BufferedReader(new InputStreamReader(ein));
	  	while ((errLine = ebr.readLine()) != null) {
	  	  System.err.println(errLine);
	  	}          	
	  	System.out.println("Thread errRun end");
	  	} catch (Exception e) {		
	  	  e.printStackTrace();      	
	  	}          
	  }
	};
		
	stdRun = new Thread(inputStreamThread);
	errRun = new Thread(errStreamThread);
		
	/* スレッドを開始します。 */
	stdRun.start();        
	errRun.start();
		
	/*プロセスが終了していなければ終了するまで待機*/
	int c = process.waitFor();
		
	/* サブスレッドが終了するのを待機 */
	stdRun.join();
	errRun.join();
		
	/*プロセス終了コード出力 */
	System.out.println(c);
		
	} catch (Exception e) {		
	  	e.printStackTrace();		
	}    
	finally{
	  	if(br!=null)br.close();
	  	if(ebr!=null)ebr.close();
		
	  	/* 子プロセス */
	  	if(in!=null)in.close();
	  	if(ein!=null)ein.close();
	  	if(out!=null)out.close();		
	}
  }

  public static void main(String[] args) {
	 
	RuntimeSample SampleRunTime = new RuntimeSample();
	try {			
		SampleRunTime.execCmd();	
	} catch (Exception e) {		
		e.printStackTrace();
	}
  }
}



技術情報 TOP へ


Google
WWW を検索 whitemark.co.jp を検索

Copyright © 2006 by WhiteMark, All rights Reserved. Last Modified: 2006/05