概要
Java 7 で導入された java.nio.file パッケージは、従来の java.io.File に比べてファイル操作を簡潔かつ安全に書けるようになりました。Java 11 では Files.readString() / writeString() が追加され、テキストファイルの読み書きが1行で完結します。しかし実務では「どのメソッドを使えばいいのか」「java.io と混在するプロジェクトでどう使い分けるのか」という迷いが生じることも多いです。この記事では、Files クラスの主要メソッドをユースケース別に整理し、コピー・移動・属性取得・ディレクトリ操作までを実務で使える形にまとめます。
使いどころ
バッチ処理でファイルを所定のディレクトリにコピー・移動し、処理済みフォルダへ振り分ける
設定ファイルやテンプレートを Files.readString() で一括読み込みし、変数を置換して出力する
指定ディレクトリ内のファイルを一覧取得し、拡張子やサイズで絞り込んでバッチ対象を決定する
コード例
import java.io.IOException;
public class NioFileOperations {
public static void main(String[] args) throws IOException {
var file = Path.of("sample_nio.txt");
var content = "1行目: NIO サンプル\n2行目: Files API\n3行目: UTF-8 デフォルト";
Files.writeString(file, content);
var text = Files.readString(file);
System.out.println("読み込み:\n" + text);
var dir = Path.of("work/output");
Files.createDirectories(dir);
var copy = dir.resolve("sample_copy.txt");
Files.copy(file, copy, StandardCopyOption.REPLACE_EXISTING);
var moved = dir.resolve("sample_moved.txt");
Files.move(copy, moved, StandardCopyOption.REPLACE_EXISTING);
System.out.println("サイズ: " + Files.size(moved) + " bytes");
var attrs = Files.readAttributes(moved, BasicFileAttributes.class);
System.out.println("更新日時: " + attrs.lastModifiedTime());
try (var stream = Files.list(dir)) {
stream.forEach(p -> System.out.println(" " + p.getFileName()));
}
Files.delete(moved);
Files.delete(dir);
Files.delete(Path.of("work"));
Files.delete(file);
}
}Version Coverage
Files.readString() / writeString()(Java 11+)で1行読み書きが可能。Path.of()(Java 11+)でパス生成も簡潔になる。
// Java 17: Path.of() + readString() で簡潔に
var file = Path.of("sample.txt");
var text = Files.readString(file); // UTF-8 がデフォルト
Files.writeString(file, "新しい内容");Library Comparison
注意点
Files.readString() / readAllLines() は全内容をメモリに読み込むため、大容量ファイルには不向き。数MB を超える場合は Files.lines() でストリーム処理すること。
Files.list() / Files.find() は Stream を返すが、内部でディレクトリハンドルを保持している。必ず try-with-resources で close すること。
Files.move() はファイルシステムをまたぐ場合にコピー+削除にフォールバックする。処理中に電源断が起きるとファイルを失う可能性がある。
Path.of() は Java 11 以降。Java 8 では Paths.get() を使う。
FAQ
新規コードでは Path を推奨します。File.toPath() で変換できるため、既存コードとの共存も容易です。
UTF-8 です。別の文字コードを使う場合は第2引数で Charset を指定してください。Shift_JIS のファイルを読む場合は Charset.forName("Shift_JIS") を渡します。
Files.walk() で深い順にソートし、Files.delete() で1つずつ削除するのが標準的な方法です。Files.delete() は空でないディレクトリには使えません。