java.nio.file.Filesで一行ごとに処理(ただしScala)
Java SE 7のjava.nio.file.Filesがとても便利な件
ファイルの内容を一行ずつ読み込んで処理したい場合に、今まではこちらのページ:(Fileの読み込み - Scala覚書)を参考に実装していましたが、nioを使えば簡単だったので、メモしておきます。
val file = Paths.get(path)
Files.readAllLines(file, Charset.defaultCharset())
.foreach(println)
Charset.defaultCharset()
が鬱陶しいですがそれに目を瞑ればシンプルです。 scala.io.Source
や java.io.BufferedReader
、 commons.io.FileUtils
だといずれもバッファをクローズする必要があるので、それに比べればだいぶ良いのではないでしょうか。
巨大なファイルのとき
これは、scala.io.Sourceを利用するのがよさそう。構造的部分型を利用したローンパターンを使わなければならないので、そのぶんコードが膨らみますが、そのぶん使用箇所はシンプルにまとまります。
using(Source.fromFile("file.txt")) {
_.getLines().foreach(println)
}
def using[A <% { def close():Unit }](s: A)(f: A=>Any) {
try f(s) finally s.close()
}
また、using内でSourceのもつメソッドを十分に活用したい場合は、構造的部分型での一般化を諦める必要があります。
参考:Scala using(ローンパターン)-Hishidama's Scala Memo-