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);
  });
}