java.io/java.nioの改善
Streamの追加に伴いjava.ioパッケージやjava.nioパッケージにも変更が加えられており、java.nio.files.FilesなどからStreamを生成するためのメソッドが追加されている。
以下java.nio.files.Filesに新たに追加されたメソッドの使用例だ。
// カレントディレクトリのファイルの一覧を返すStreamを取得する
try(Stream<Path> stream = Files.list(Paths.get("."))){
stream.forEach(path -> {
System.out.println(path);
});
}
// ファイルの内容を1行ごとに返すStreamを取得する
try(Stream<String> stream = Files.lines(Paths.get("test.txt"), StandardCharsets.UTF_8)){
stream.forEach(line -> {
System.out.println(line);
});
}
// カレントディレクトリ配下のファイルをツリーウォークするStreamを取得する
try(Stream<Path> stream = Files.walk(Paths.get("."), Integer.MAX_VALUE)){
stream.forEach(path -> {
System.out.println(path);
});
}
// カレントディレクトリ配下から「.java」で終わるファイルを検索する
try(Stream<Path> stream = Files.find(Paths.get("."), Integer.MAX_VALUE, (path, attr) -> {
return path.toString().endsWith(".java");
})){
stream.forEach(path -> {
System.out.println(path);
});
};
これらのメソッドが返すStreamはFileInputStreamなどと同様、使用後はクローズする必要があるが、StreamはAutoCloseableインタフェースを実装しており、上記のようにtry-with-resources文を使用することで確実にクローズすることができる。
この他にもBufferedReaderに1行ごとに文字列を返すlines()メソッドが追加されている。こちらはStreamのclose()メソッドではBufferedReaderはクローズされず、BufferedReader自体をクローズする必要がある点に注意して欲しい。
try(BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream("test.txt"), "UTF-8"))){
reader.lines().forEach(line -> {
System.out.println(line);
});
}