LoginSignup
103
99

More than 5 years have passed since last update.

Java8にもなったんだからFiles使おう

Last updated at Posted at 2015-11-19

というだけの記事です。まだ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
    });
}

Files#lines(Path, Charset)

引数がPathばかりですが、古いFileを使ったコードとの互換性もFile#toPath()を使って一瞬です。
互換性が必要ない場合はPathsで生成しましょう。

lines以外はJava7から存在していて、すでに登場から4年立っています。まだ知らなかった人はたまにはJavaDocを眺めるようにしましょう。

標準ライブラリが進化してくれるとOSSも自作ライブラリも使えないという暗黒中世めいた開発現場でもあんしんですね。えっ?まだJava5を使ってる?えっ?

103
99
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
103
99