Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Files.copy() / move() / list() / walk()
ファイルのコピー・移動・リネームや、ディレクトリ内のファイル一覧取得を行うメソッドです。Files クラスのメソッドを使うことで、従来の File クラスより直感的にファイル操作が行えます。
構文
// ファイルをコピーします。
Files.copy(コピー元Path, コピー先Path);
// 上書きを許可してコピーします。
Files.copy(コピー元Path, コピー先Path, StandardCopyOption.REPLACE_EXISTING);
// ファイルを移動(またはリネーム)します。
Files.move(移動元Path, 移動先Path);
// ディレクトリ直下のファイル・ディレクトリ一覧を取得します。
Stream<Path> entries = Files.list(Path.of("ディレクトリパス"));
// ディレクトリを再帰的に走査します。
Stream<Path> all = Files.walk(Path.of("ディレクトリパス"));
メソッド一覧
| メソッド | 概要 |
|---|---|
| Files.copy(src, dst) | ファイルをコピーします。コピー先が既に存在する場合は例外がスローされます。 |
| Files.copy(src, dst, options) | StandardCopyOption.REPLACE_EXISTING を指定すると上書きを許可します。 |
| Files.move(src, dst) | ファイルを移動またはリネームします。同一ファイルシステム内ではアトミックに実行されます。 |
| Files.list(dir) | ディレクトリ直下のエントリを Stream<Path> で返します。再帰的には走査しません。 |
| Files.walk(start) | 指定したディレクトリを再帰的に走査した Stream<Path> を返します。深さを第2引数で制限できます。 |
| Files.find(start, depth, BiPredicate) | 条件に合うパスだけを再帰的に検索して Stream<Path> で返します。 |
サンプルコード
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
// ファイルをコピーします(上書き許可)。
try {
Files.copy(
Path.of("original.txt"),
Path.of("backup.txt"),
StandardCopyOption.REPLACE_EXISTING
);
System.out.println("コピーが完了しました。");
} catch (IOException e) {
e.printStackTrace();
}
// ファイルを移動(リネーム)します。
try {
Files.move(
Path.of("old_name.txt"),
Path.of("new_name.txt"),
StandardCopyOption.REPLACE_EXISTING
);
System.out.println("移動が完了しました。");
} catch (IOException e) {
e.printStackTrace();
}
// ディレクトリ直下のファイル一覧を取得します。
try (var stream = Files.list(Path.of("."))) {
stream.forEach(p -> System.out.println(p.getFileName()));
} catch (IOException e) {
e.printStackTrace();
}
// ディレクトリを再帰的に走査して .txt ファイルだけ出力します。
try (var stream = Files.walk(Path.of("."))) {
stream
.filter(p -> p.toString().endsWith(".txt"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
概要
『Files.list()』と『Files.walk()』は Stream を返すため、try-with-resources で使用してください。ストリームを閉じないとファイルハンドルがリークします。
『Files.walk()』でディレクトリを中身ごと削除するには、深い階層から順に削除する必要があります。sorted(Comparator.reverseOrder()) を組み合わせると、サブディレクトリを先に削除できます(例: walk(dir).sorted(Comparator.reverseOrder()).forEach(Files::delete))。
ファイルの存在確認・作成については『Files.exists() / isFile() / isDirectory()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。