Java8入門:NIO.2でファイル操作
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 速攻入門
posted with amazlet at 17.10.01
櫻庭 祐一
技術評論社
売り上げランキング: 467,147
技術評論社
売り上げランキング: 467,147
参考となるサイト
投稿日 2017年10月12日