【プログラミングしてみよう36】Javaでファイルを列挙・操作する(Filesクラス)

Java

前回はMavenとGradleを使ったビルドツールの基本を学びました。

今回は「Filesクラス」について解説します。 以前ファイルの読み書きで FileWriterBufferedReader を使いましたが、Java 7から追加された java.nio.file.Files クラスを使うと、ファイルの読み書きだけでなく、コピー・移動・削除・フォルダ内のファイル列挙などをよりシンプルに書けるようになります。

Filesクラスの基本

Files クラスは java.nio.file パッケージに含まれており、ファイル操作に関するstaticメソッドが多数用意されています。合わせて Path クラスを使ってファイルのパスを表現します。

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

よく使うメソッドは以下の通りです。

Files.writeString(path, text)      // 文字列をファイルに書き込む
Files.readString(path)             // ファイルを文字列として読み込む
Files.readAllLines(path)           // ファイルを1行ずつリストとして読み込む
Files.copy(source, target)         // ファイルをコピーする
Files.move(source, target)         // ファイルを移動・リネームする
Files.delete(path)                 // ファイルを削除する
Files.exists(path)                 // ファイルが存在するか確認する
Files.createDirectory(path)        // フォルダを作成する
Files.list(path)                   // フォルダ内の一覧を取得する
Files.walk(path)                   // フォルダを再帰的に探索する

サンプルコード(ファイルの読み書きと基本操作)

ファイル作成

「Java24」フォルダに FilesTest.java という名前でファイルを作成します

コード入力

以下のコードを入力します。

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.io.IOException;
import java.util.List;

public class FilesTest {
    public static void main(String[] args) {
        Path filePath = Paths.get("sample.txt");
        Path copyPath = Paths.get("sample_copy.txt");

        try {
            // ファイルへの書き込み
            String content = "1行目: ぱんまる\n2行目: たろう\n3行目: はなこ";
            Files.writeString(filePath, content);
            System.out.println("ファイルに書き込みました: " + filePath);

            // ファイルの存在確認
            System.out.println("ファイルは存在する?: " + Files.exists(filePath));

            // ファイルを文字列として読み込む
            String readContent = Files.readString(filePath);
            System.out.println("\n--- readString ---");
            System.out.println(readContent);

            // ファイルを1行ずつリストとして読み込む
            List<String> lines = Files.readAllLines(filePath);
            System.out.println("\n--- readAllLines ---");
            for (int i = 0; i < lines.size(); i++) {
                System.out.println((i + 1) + "行目: " + lines.get(i));
            }

            // ファイルのコピー
            Files.copy(filePath, copyPath, StandardCopyOption.REPLACE_EXISTING);
            System.out.println("\nコピーしました: " + copyPath);

            // ファイルの削除
            Files.delete(copyPath);
            System.out.println("コピーを削除しました: " + copyPath);

        } catch (IOException e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

コンパイル

javac FilesTest.java

実行

java FilesTest

実行結果は次のようになります。

ファイルに書き込みました: sample.txt
ファイルは存在する?: true

--- readString ---
1行目: ぱんまる
2行目: たろう
3行目: はなこ

--- readAllLines ---
1行目: 1行目: ぱんまる
2行目: 2行目: たろう
3行目: 3行目: はなこ

コピーしました: sample_copy.txt
コピーを削除しました: sample_copy.txt

サンプルコード(フォルダ内のファイル列挙)

ファイル作成

「Java24」フォルダに FilesWalkTest.java という名前でファイルを作成します

コード入力

以下のコードを入力します。

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;

public class FilesWalkTest {
    public static void main(String[] args) {
        Path dir = Paths.get(".");

        try {
            // フォルダ直下のファイル・フォルダを列挙
            System.out.println("--- カレントフォルダの一覧 ---");
            Files.list(dir)
                 .sorted()
                 .forEach(path -> {
                     String type = Files.isDirectory(path) ? "[フォルダ]" : "[ファイル]";
                     System.out.println(type + " " + path.getFileName());
                 });

            // フォルダを再帰的に探索して.javaファイルだけ表示
            System.out.println("\n--- .javaファイルの一覧 ---");
            Files.walk(dir)
                 .filter(path -> path.toString().endsWith(".java"))
                 .sorted()
                 .forEach(path -> System.out.println(path));

        } catch (IOException e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

コンパイル

javac FilesWalkTest.java

実行

java FilesWalkTest

実行結果は次のようになります。

--- カレントフォルダの一覧 ---
[ファイル] FilesTest.class
[ファイル] FilesTest.java
[ファイル] FilesWalkTest.class
[ファイル] FilesWalkTest.java
[ファイル] sample.txt

--- .javaファイルの一覧 ---
./FilesTest.java
./FilesWalkTest.java

コードの解説

Paths.get("sample.txt") でファイルのパスを表す Path オブジェクトを作成します。相対パスで指定した場合は、プログラムを実行したフォルダを基準にします。

Files.writeString(path, content) は文字列をファイルに書き込みます。以前の FileWriter + BufferedWriter と同じことが1行でできます。ファイルが存在しない場合は自動的に新規作成されます。

Files.readString(path) はファイルの内容をまるごと1つの文字列として読み込みます。Files.readAllLines(path) は1行ずつ List<String> として読み込みます。前回学んだStreamAPIと同じように扱える点が便利です。

Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING) でファイルをコピーします。StandardCopyOption.REPLACE_EXISTING は、コピー先に同名のファイルが存在する場合に上書きするオプションです。

Files.list(dir) はフォルダ直下の一覧をStreamとして返します。Files.walk(dir) はサブフォルダも含めて再帰的に探索します。どちらもStreamなので、前回学んだ filter()sorted() と組み合わせてシンプルに書けます。Files.isDirectory(path) でフォルダかファイルかを判定できます。

まとめ

Files クラスを使うことで、ファイルの読み書き・コピー・削除・フォルダ内の列挙などをシンプルに行えます。Files.writeStringFiles.readString で手軽な読み書きを、Files.listFiles.walk でフォルダ内のファイル探索をそれぞれ覚えておきましょう。Stream APIと組み合わせることで、特定の拡張子のファイルだけ絞り込むといった処理も簡潔に書けます。以前学んだ FileWriterBufferedReader は細かい制御が必要な場面で、Files クラスはシンプルに書きたい場面で使い分けるとよいでしょう。

2026/07/15(水) ぱんまる

コメント

タイトルとURLをコピーしました