eachを使ってファイルを読む場合の文字コード指定

Thoughtworksアンソロジーの多言語プログラミングの章で紹介されているコード。

def number = 0
new File(args[0]).eachLine { line->
   number++
   println "${number}:${line}"
}

ファイルを1行ずつ読んで、行番号付きで標準出力に書き出すだけのコードだけど、javaだと結構長くなる、groovyなら短いよ、と。


windowsで上記のコードを実行した場合、test.txtがsjis、utf8だと問題なく読めるけど、eucjpだと文字化けする。


内部的にCharsetToolkitというクラスので内部メソッドguessEncodingで文字コードを推定していて、
UTF-8、US-ASCII、UTF-16LE、UTF-16BEのいずれかを判定しようとする。
どれでもないとOSのデフォルトで読む。(Windowsの場合、Windows-31j

なので読みこむファイルがeuc-jpとか、自動判定で判別できない文字コードだとわかっている場合は

def number = 0
new File(args[0]).newReader("eucjp").eachLine{
   number++
   println "${number}:${line}"
}

こうしとけばとりあえず読める。