Scalaでちょっとスマートにファイルを読み込んでみる

2013年5月16日

Scalaだと、テキストファイルなどを開く時は
[scala]// ファイルを開いてインスタンスを得る
val src = Source.fromFile(currentFile)

// ファイルの行をforeach
src.getLines().foreach(println)

// ファイルを閉じる
src.close[/scala]
と書いたりしますが

なんか、最後にclose書かないと行けないのがスマートじゃ無いなと思ったりします。

なので、ちょっとこの辺をいじってみましょう。

参考として、Rubyの場合は、このように書けます。
[ruby]File.open("foo") {|f|
f.each_line {|line|
print line
}
}[/ruby]
ブロック内でファイル操作という感じですね。

ScalaでもRubyと同様にブロック内でファイル操作、という感じが出来れば嬉しいので

ファイルを開く->ブロック内で処理->ファイルを閉じるという事をするメソッドを書きます。
[scala][/scala]def stringFileInput(file: File)(f: BufferedReader => Unit) {
val in = new FileInputStream(file)
try {
f(new BufferedReader(new InputStreamReader(in)))
} finally {
in.close
}
}

// 使用例
stringFileInput(currentFile) { reader =>
while(reader.ready) {
println(reader.readLine)
}
}[/ruby]

Scala

Posted by GENDOSU