Java
 Computer >> コンピューター >  >> プログラミング >> Java

【Java入門】拡張子を指定してディレクトリ内のファイルを検索・一覧表示する方法

Javaで特定の拡張子を持つファイルだけを抽出したい場面は多くあります。例えば、フォルダ内からPDFファイルや画像ファイルだけを取り出して処理したいケースなどが該当します。

本記事では、Files.walk()メソッドとStream APIを使った方法、およびFilenameFilterインターフェースを使った方法の2つのアプローチで、指定した拡張子のファイルを検索する方法を解説します。

方法1:Files.walk()とStreamのfilter()を使う

まずは、NIOのFiles.walk()メソッドでディレクトリ内の全ファイルを走査し、Streamのfilter()で拡張子によって絞り込む例です。この方法ではサブディレクトリも含めて再帰的に検索できるのが特徴です。

サンプルコード

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class Demo {
    public static void main(String[] args) throws IOException {
        Stream<Path> path = Files.walk(Paths.get("D:\\ExampleDirectory"));
        System.out.println("PDFファイルの一覧:");
        path = path.filter(var -> var.toString().endsWith(".pdf"));
        path.forEach(System.out::println);

        path = Files.walk(Paths.get("D:\\ExampleDirectory"));
        System.out.println("JPGファイルの一覧:");
        path = path.filter(var -> var.toString().endsWith(".jpg"));
        path.forEach(System.out::println);

        path = Files.walk(Paths.get("D:\\ExampleDirectory"));
        System.out.println("テキストファイルの一覧:");
        path = path.filter(var -> var.toString().endsWith(".txt"));
        path.forEach(System.out::println);

        path = Files.walk(Paths.get("D:\\ExampleDirectory"));
        System.out.println("Wordファイルの一覧:");
        path = path.filter(var -> var.toString().endsWith(".docx"));
        path.forEach(System.out::println);
    }
}

実行結果

PDFファイルの一覧:
D:\ExampleDirectory\demo1.pdf
D:\ExampleDirectory\demo2.pdf
JPGファイルの一覧:
D:\ExampleDirectory\sample_jpeg1.jpg
D:\ExampleDirectory\sample_jpeg2.jpg
テキストファイルの一覧:
D:\ExampleDirectory\sample1.txt
D:\ExampleDirectory\sample2.txt
D:\ExampleDirectory\sample3.txt
Wordファイルの一覧:
D:\ExampleDirectory\test1.docx
D:\ExampleDirectory\test2.docx

このように、filter()の中でendsWith()を使って文字列の末尾が目的の拡張子と一致するかを判定することで、簡単にファイルを絞り込むことができます。

方法2:FilenameFilterインターフェースを使う

次に、従来のFileクラスとFilenameFilterインターフェースを組み合わせる方法です。accept()メソッドを実装したフィルターを作成し、list()メソッドに渡すことで、条件に合致するファイル名のみを取得できます。

サンプルコード

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
public class MyExample {
    public static void main(String args[]) throws IOException {
        // ディレクトリを表すFileオブジェクトを生成
        File directoryPath = new File("D:\\ExampleDirectory");

        // PDFファイル用のフィルターを作成
        FilenameFilter pdfFilefilter = new FilenameFilter() {
            public boolean accept(File dir, String name) {
                String lowercaseName = name.toLowerCase();
                if (lowercaseName.endsWith(".pdf")) {
                    return true;
                } else {
                    return false;
                }
            }
        };

        String fileList[] = directoryPath.list(pdfFilefilter);
        System.out.println("指定したディレクトリ内のPDFファイル一覧:");
        for (String fileName : fileList) {
            System.out.println(fileName);
        }
    }
}

実行結果

指定したディレクトリ内のPDFファイル一覧:
demo1.pdf
demo2.pdf

サンプルコードでは、toLowerCase()でファイル名を小文字に変換してから判定しているため、「.PDF」や「.Pdf」のように大文字小文字が混在する拡張子にも対応できます。

まとめ

  • Files.walk() + Stream:サブディレクトリも含めて再帰的に検索したい場合に便利。モダンな書き方で可読性も高い。
  • FilenameFilter:対象ディレクトリ直下のファイルだけを取得したい場合にシンプルに使える伝統的な手法。

用途に応じて使い分けることで、効率的にファイル検索処理を実装できます。

  1. Javaでディレクトリ階層を作成する方法|mkdirs()メソッドの使い方を解説

    java.ioパッケージに含まれるFileクラスは、システム上のファイルやディレクトリ(パス名)を表現するためのクラスです。このクラスには、ファイルやディレクトリに対してさまざまな操作を行うためのメソッドが数多く用意されています。 mkdir()メソッドを使用すると、現在のFileオブジェクトが表すパスにディレクトリを1つ作成できます。ただし、このメソッドは親ディレクトリが存在しない場合には失敗するという点に注意が必要です。 ディレクトリ階層を作成するには? 複数階層からなる新しいディレクトリ構造を一括で作成したい場合は、同じFileクラスのmkdirs()メソッドを使用します。このメソッドは

  2. Javaでディレクトリ内のすべてのファイルを再帰的に一覧表示する方法

    この記事では、Javaを使って指定したディレクトリ内のすべてのファイルを再帰的に一覧表示するプログラムを解説します。サブディレクトリの中にあるファイルまで含めて取得できるため、フォルダ全体の内容を把握したい場合に便利なテクニックです。 前提となるディレクトリ構成 Dドライブ直下に「ExampleDirectory」というフォルダがあり、その中に7つのファイルと2つのサブディレクトリが格納されていると仮定します。 各サブディレクトリの内容は以下の通りです。 SampleDirectory1:SampleFile1.txt と SampleFile2.txt の2つのファイルを含みます。 Sa