Scalaでちょっとスマートにファイルを読み込んでみる
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]