*Processのラッパー [#q24a5bdb]
Java言語での不都合、といっても書き方がじょちょうになる程度
を改善するためにラッパーを書きます。

**ProcessScala [#jf3e6498]
 package test
 
 import scala.util.DynamicVariable
 import java.lang.Process
 import java.io._
 
 case class ProcessScala(charset :String) {
	val dynamicvariable= new DynamicVariable[Process](null)
 
	var stdout :BufferedReader = null;
	var stderr :BufferedReader = null;
	//var stdin :BufferedWriter = null;
 
	//デフォルトのキャラクタコードを使う
	def this() = this("")
 
 
	//自動的にDestroyするProcess
	def exec(cmd:String)(block : => Unit){
       var process :Process = null
	   try {
	     process = Runtime.getRuntime.exec(cmd)
	  	 stdout = getBufferdReader(process.getInputStream(),"")
	     stderr = getBufferdReader(process.getErrorStream(),"")
         dynamicvariable.withValue(process){block}
	   } catch {
	      //dir とか 普通に実行させたい
	      case e:java.io.IOException =>{
	        try {
		        if (cmd.length < 7 || !(cmd.substring(0,6) == "cmd /c")){
		           //cmd /cを追加してみる
		           process = Runtime.getRuntime.exec("cmd /c " + cmd)
		           stdout = getBufferdReader(process.getInputStream(),"")
		           stderr = getBufferdReader(process.getErrorStream(),"")
		           dynamicvariable.withValue(process){block}
		           //process.waitFor
		        }
	        } catch { 
	          case e =>println (cmd + " is exsits?")
	            throw e
            }
          }
	   } finally {
	     //子プロセス呼び出し後は,必ず,ストリームを閉じる
	     	if (process != null) {
		        process.getErrorStream().close();
		        process.getInputStream().close();
		        process.getOutputStream().close();
		        process.destroy();
	        }
            if (stdout != null) {
            	try {stdout.close} catch {case e:IOException => }
            }
            if (stderr != null) {
            	try {stderr.close} catch {case e:IOException => }
            }
	   }
	}
 
    //get dynamic variable's value
    def $_()={
        dynamicvariable.value
    } 
    
    def getBufferdReader(is:InputStream, charset :String):BufferedReader = {
        if (charset == "") {
        	new BufferedReader(new InputStreamReader(is));
        } else {
			try {
				new BufferedReader(new InputStreamReader(is, charset));
			} catch {
				case e: UnsupportedEncodingException => {
					throw new RuntimeException(e);
				}
			}   
        }
    }
    
 }

**processMain.scala [#x75be347]
呼び出し例をあげておきます。

 package test
 
 object ProcessMain {
  def main(args: Array[String]): Unit = {
    var p:ProcessScala =  new ProcessScala
    p.exec("dir"){
      var line:String = null
      while({line = p.stdout.readLine ; line != null}){
        println(line)
      }
   }
  }    
 }
トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS