というだけの記事です。まだJava7から標準ライブラリに入ったjava.nio.file.Filesを知らない人向け。
昔
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
今
BufferedReader br = Files.newBufferedReader(path, StandardCharsets.UTF_8);
Files#newBufferedReader(Path, Charset)
StandardCharsets#UTF_8
ちなみに今やCharsetは実行環境によらずデフォルトでUTF-8だそうですが、指定した方がいいと思います。StandardCharsetsがあるのでいちいち文字列定数で"UTF-8"と書いてtypoの危険性を孕む必要性はなくなりました。ただし、SJISことWindows-31JやEUC-JPは残念ながらありません。
ときどき欲しくなるファイルの全行読みも一発です。
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
Files#readAllLines(Path, Charset)
ファイルサイズが想定できずメモリ負荷が危ぶまれるときはJava8から入ったlinesでStreamで処理できます。複雑なことをしないのなら、BufferedReaderで単調なreadLineループを書くよりこちらの方がいいでしょう。
// この場合はCloseする必要があります。
try (Stream<String> stream = Files.lines(path, StandardCharsets.UTF_8)) {
stream.forEach(line -> {
// do something
});
}
引数がPathばかりですが、古いFileを使ったコードとの互換性もFile#toPath()を使って一瞬です。
互換性が必要ない場合はPathsで生成しましょう。
lines以外はJava7から存在していて、すでに登場から4年立っています。まだ知らなかった人はたまにはJavaDocを眺めるようにしましょう。
標準ライブラリが進化してくれるとOSSも自作ライブラリも使えないという暗黒中世めいた開発現場でもあんしんですね。えっ?まだJava5を使ってる?えっ?