Hatena::ブログ(Diary)

ブログタイトル入力

2010年12月14日

[]テキストファイルをオープンして内容を出力する 19:18

(この記事は Scala Advent Calendar jp 2010 : ATND の8日目です。)


「scala.io.Source.fromFile」というのがあってそれが使えそうだった。

val filename = "test.txt"
scala.io.Source.fromFile(filename).getLines.foreach(println)

おおお簡単!と思ったんだけど、自動ではcloseしてくれないよね。

仕方なく自分でcloseする。

val filename = "test.txt"
val source = scala.io.Source.fromFile(filename)
try {
  source.getLines.foreach(println)
} finally {
  source.close
}

毎回これ書くのはめんどくさい。scalaが俺にユーティリティ関数を作れと囁いている。

def getLinesFromFile(filename: String, f:(String) => Unit) = {
  val source = scala.io.Source.fromFile(filename)
  try {
    source.getLines.foreach(f)
  } finally {
    source.close
  }
}
getLines("test.txt", println)

第一引数がファイル名、第二引数が実行させたい関数です。

で、scala.io.Sourceのソース読んだけど、FileInputStreamをラップしているような感じですね。


ただいま有志が逆引きScalaというTips集を作成しています。まだネタ不足気味なので、何かいいネタがあったら教えて下さい。


追記:こう書いた方がいいんじゃないかって話戴きました。ありがとうございます。自動的に閉じるSource - ( ???) ゆるよろ日記

  1. LoanPattern使って書く
  2. Iteratorに対して、そもそもSource自身が最後まで読んだら自動的に閉じる