ProcessScala?

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

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