zacca blog

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ScalaでZipの再帰的解凍

ScalaはIOまわり弱いらしいと聞いてたけどほんとだな。
全てJavaのクラスじゃないか・・・?
まあScalaだから楽に書ける分にはいいのだが。
InputとOutputを繋ぐpipeを作って、内側でバッファで包んで再帰関数(_pipe)回すのが上手く入ったのは気持よかった。

ソースは追記で。
にしてもScalaのシンタックスハイライト欲しいなぁ・・・。
FC2で簡単に使えるの無いかしら。


import org.apache.tools.zip.{ZipFile,ZipEntry}
import java.util.Enumeration
import java.io.{File,InputStream,BufferedInputStream,
FileOutputStream,OutputStream,BufferedOutputStream}

object Unzipper {
def main(args:Array[String]) {
if(args.length<1) exit(1)
println("ZipFile:"+args(0))
if(args.length==2) unzip(args(0),args(1)) else unzip(args(0))
}
def enumerationToList[T](entries:Enumeration[_]):List[T] = {
if(entries.hasMoreElements)
entries.nextElement.asInstanceOf[T] :: enumerationToList[T](entries)
else List[T]()
}
def unzip(path:String,to:String = "./") {
val zip = new ZipFile(path)
val lst = enumerationToList[ZipEntry](zip.getEntries)
lst.foreach{ entry =>
if(!entry.isDirectory) {
val file = new File(to + entry.getName)
file.getParentFile.mkdirs
println(file.getPath)
val in = new BufferedInputStream(zip.getInputStream(entry))
val out = new BufferedOutputStream(new FileOutputStream(file.getPath))
pipe(in,out)
out.close
in.close
if(entry.getName.endsWith(".zip")) {
val name = to + entry.getName
val parent = (new File(name)).getParent + "/"
unzip(name,parent)
file.delete
}
}
}
}
def pipe(in:InputStream,out:OutputStream) {
val i =
if(in.isInstanceOf[BufferedInputStream]) in
else new BufferedInputStream(in)
val o =
if(in.isInstanceOf[BufferedOutputStream]) out
else new BufferedOutputStream(out)
_pipe(i,o)
o.flush

def _pipe(in:InputStream,out:OutputStream) {
val byte = in.read
if(byte != -1) {
out.write(byte)
_pipe(in,out)
}
}
}
}

コメント


管理者にだけ表示を許可する
 

 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。