Java File listFiles() メソッド

Java File Java File


listFiles()メソッドは Java のjava.io.Fileクラスが提供する重要なメソッドで、現在のディレクトリ内のすべてのファイルとサブディレクトリを取得するために使用されます。このメソッドはFileオブジェクト配列を返し、各Fileオブジェクトはディレクトリ内の1つのファイルまたはサブディレクトリを表します。

メソッド構文

listFiles()メソッドには次のいくつかのオーバーロード形式があります:

public File[] listFiles()
public File[] listFiles(FilenameFilter filter)
public File[] listFiles(FileFilter filter)

基本的な使い方

ディレクトリ内のすべてのファイルとサブディレクトリを取得する

最も基本的な使い方は、パラメータを付けずに直接呼び出すことです:listFiles()メソッド:

例

import java.io.File;

public class ListFilesExample {
    public static void main(String[] args) {
        // ディレクトリを表す File オブジェクトを作成する
        File directory = new File("C:/example");
       
        // ディレクトリ内のすべてのファイルとサブディレクトリを取得する
        File[] files = directory.listFiles();
       
        // ファイル名を走査して出力する
        if (files != null) {
            for (File file : files) {
                System.out.println(file.getName());
            }
        }
    }
}

メソッドのパラメータ

FilenameFilter インターフェース

FilenameFilterは関数型インターフェースであり、ファイル名をフィルタリングするために使用されます:

例

File[] listFiles(FilenameFilter filter)

例:一覧表示するのは.txtファイルのみ

例

File directory = new File("C:/example");
File[] textFiles = directory.listFiles((dir, name) -> name.endsWith(".txt"));

FileFilter インターフェース

FileFilterも関数型インターフェースですが、これはFileオブジェクトに基づいてフィルタリングします:

例

File[] listFiles(FileFilter filter)

例:ディレクトリのみを一覧表示

例

File directory = new File("C:/example");
File[] subDirectories = directory.listFiles(File::isDirectory);

注意事項

  1. null チェック:もしFileオブジェクトがディレクトリでないか、読み取り権限がない場合、listFiles()は null を返しますnull。したがって、戻り値を確認する必要があります。

  2. パフォーマンスの考慮事項:多数のファイルを含むディレクトリの場合、listFiles()多くのメモリを消費する可能性があります。これは、すべてのファイル情報を一度にロードするためです。

  3. 並び順の問題:返されるファイル配列は特定の順序を保証しません。並べ替えが必要な場合は、配列を手動で並べ替えることができます。

  4. シンボリックリンク:Unix/Linux システムでは、listFiles()はシンボリックリンクに従います。


実際の応用例

再帰的にすべてのファイルを一覧表示する

例

import java.io.File;

public class RecursiveFileListing {
    public static void listFilesRecursively(File directory) {
        File[] files = directory.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    listFilesRecursively(file);
                } else {
                    System.out.println(file.getAbsolutePath());
                }
            }
        }
    }
   
    public static void main(String[] args) {
        listFilesRecursively(new File("C:/example"));
    }
}

Java 8 Stream API を使用する

例

import java.io.File;
import java.util.Arrays;
import java.util.stream.Stream;

public class FileStreamExample {
    public static void main(String[] args) {
        File directory = new File("C:/example");
       
        // Stream を使用してファイルを処理する
        Stream.of(directory.listFiles())
              .filter(File::isFile)
              .map(File::getName)
              .forEach(System.out::println);
    }
}

代替手段

Java 7 以上のバージョンでは、java.nio.fileパッケージ内のFilesとPathクラスの使用を検討できます。これらはより現代的なファイル操作の方法を提供します:

例

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class NioFileListing {
    public static void main(String[] args) throws Exception {
        Path dir = Paths.get("C:/example");
       
        try (Stream<Path> stream = Files.list(dir)) {
            stream.filter(Files::isRegularFile)
                  .map(Path::getFileName)
                  .forEach(System.out::println);
        }
    }
}

まとめ

listFiles()メソッドは Java のファイル操作における基本的なツールであり、その使用方法を習得することはファイル処理にとって非常に重要です。実際の開発では、具体的な要件に応じて適切なフィルタリング方法を選択し、発生し得る例外に対処することに注意してください。新しいプロジェクトでは、Java NIO のFilesクラスの使用を検討することをお勧めします。これにより、より強力で柔軟なファイル操作機能が提供されます。

Java File Java File

その他の拡張