Java8入門:NIO.2でファイル操作

Java Logo

Java7で導入されたNIO.2を学んだ。従来のFileクラスに比べて、分かりやすくなった感じがある。

利用するクラス

以下のクラスが中心的なクラスとなる。

クラス名 説明
java.nio.file.Path ファイルやディレクトリの位置を示す
java.nio.file.Paths Pathに関するユーティリティ
java.nio.file.Files Pathを用いてファイル操作を行うユーティリティ

サンプルコード

Sample/FilesAndPath.java at master · eiKatou/Sample

パスを生成する
Pathの生成はPathsクラスを利用する。

Path path1 = Paths.get("foo.txt");

パスを組み合わせる

final String DOWNLOAD_PATH = "/Users/ei/Downloads/";
Path path2 = Paths.get(DOWNLOAD_PATH);
// 2つのPathを組み合わせて、Pathを生成
vPath path3 = path2.resolve(path1);

親ディレクトリのパスを取得する

// 親パスの取得
Path pPath = path.getParent();

ファイル名のみを取得する

String fileName = path.getFileName();

ファイル・ディレクトリがあるか調べる

boolean fooExists = Files.exists(fooPath, LinkOption.NOFOLLOW_LINKS);

ファイル・ディレクトリを作成する

Files.createFile(fooPath);
Files.createDirectory(dirPath);

ファイル・ディレクトリを削除する
ディレクトリの場合は中身が空でないと削除できない。ディレクトリの中を走査して順にファイルを削除するコードを書く必要がある。

Files.deleteIfExists(fooPath);
Files.delete(fooPath);

ファイル・ディレクトリをコピーする
ディレクトリの中にファイルがあるとコピーできない。ディレクトリの中を走査して順にファイルをコピーしていくコードを書く必要がある。

Files.copy(fooPath, hogePath);

ファイル・ディレクトリを移動する
ディレクトリの場合、中にファイルがあっても移動が可能。

Files.move(fooPath, foo2Path);

ファイルの属性情報を取得する

PosixFileAttributes attributes = Files.readAttributes(foo2Path, PosixFileAttributes.class);
System.out.println("Size:" + attributes.size());
System.out.println("Owner:" + attributes.owner());
System.out.println("Permission:" + PosixFilePermissions.toString(attributes.permissions()));

ディレクトリ配下の一覧を出力する
3パターンほどやり方がある。listメソッドは指定したディレクトリの直下のみ。walkメソッドはディレクトリの中を潜っていける。第2引数で深さを指定する。FileVisitorを使うと、ファイルが見つかった時に好きな挙動をさせる事ができる。ディレクトリ丸ごとコピーするときは、FileVisitorで順にコピーしていく。

// ディレクトリ配下を走査して、一覧を出力する
Files.list(basePath)
  .forEach(System.out::println);

// ディレクトリ配下を走査して、一覧を出力する
Files.walk(basePath)
  .forEach(System.out::println);

// ディレクトリ配下を走査して、一覧を出力する
FileVisitor<Path> visitor = new FileVisitor<Path>() {

  @Override
  public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
    System.out.println("preVisitDirectory:" + dir);
    return FileVisitResult.CONTINUE;
  }

  @Override
  public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    System.out.println("visitFile:" + file);
    return FileVisitResult.CONTINUE;
  }

  @Override
  public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
    return FileVisitResult.TERMINATE;
  }

  @Override
  public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
    return FileVisitResult.CONTINUE;
  }
};
Files.walkFileTree(basePath, visitor);

参考書籍

Java7/8を勉強するのにおすすめの本。
今回も参考にさせていただいた。

現場で使える[最新]Java SE 7/8 速攻入門
櫻庭 祐一
技術評論社
売り上げランキング: 467,147

参考となるサイト

Java NIO2のおさらいメモ - Qiita