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)
}
}
}
}