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

Javaでフォルダ内のディレクトリ(フォルダ)のみを取得する方法

Javaで特定のフォルダに含まれるファイルではなく、ディレクトリ(サブフォルダ)だけを取得したいケースはよくあります。本記事では、代表的な2つの方法——FileFilterインターフェースを使う方法と、NIOのFiles.walk()を使う方法——をサンプルコード付きで解説します。

listFiles()メソッドとFileFilterの基本

FileクラスのlistFiles()メソッドは、そのFileオブジェクトが表すパスに含まれるすべてのファイルおよびディレクトリの抽象パス名を、配列として返します。

ここで活躍するのがFileFilterインターフェースです。FileFilterはパス名をフィルタリングするためのインターフェースで、listFiles()メソッドの引数として渡すことができます。すると、このメソッドはフィルターの条件を満たす要素だけを返します。

つまり、「ディレクトリのみを受け入れるFileFilterを実装してlistFiles()に渡せば」、フォルダ内のディレクトリだけを簡単に抽出できるのです。

以下は、例として使用するD:\ExampleDirectoryの内容イメージです。

Javaでフォルダ内のディレクトリ(フォルダ)のみを取得する方法

方法1:FileFilterを使ってディレクトリのみを取得する

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

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

        // ディレクトリのみを受け入れるフィルターを作成
        FileFilter fileFilter = new FileFilter() {
            public boolean accept(File dir) {
                if (dir.isDirectory()) {
                    return true;
                } else {
                    return false;
                }
            }
        };

        // フィルターを適用してディレクトリの一覧を取得
        File[] list = directoryPath.listFiles(fileFilter);

        System.out.println("指定されたディレクトリ内のディレクトリ一覧:");
        for (File fileName : list) {
            System.out.println(fileName);
        }
    }
}

実行結果

指定されたディレクトリ内のディレクトリ一覧:
D:\ExampleDirectory\sample directory1
D:\ExampleDirectory\sample directory2
D:\ExampleDirectory\sample directory3
D:\ExampleDirectory\sample directory4

補足:ラムダ式でさらにシンプルに

Java 8以降では、FileFilterは関数型インターフェースなので、ラムダ式を使えば次のように1行で書くこともできます。

File[] list = directoryPath.listFiles(file -> file.isDirectory());

方法2:NIOのFiles.walk()を使う方法

Java 7で導入されたNIO(java.nio.fileパッケージ)を利用すれば、ストリームAPIと組み合わせてよりモダンな書き方も可能です。Files.walk()でパスのストリームを取得し、filter(Files::isDirectory)でディレクトリのみに絞り込みます。

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 ListOfFiles {
    public static void main(String[] args) throws IOException {
        Stream<Path> path = Files.walk(Paths.get("D:\\ExampleDirectory"));
        path = path.filter(Files::isDirectory);
        path.forEach(System.out::println);
    }
}

実行結果

D:\ExampleDirectory
D:\ExampleDirectory\sample directory1
D:\ExampleDirectory\sample directory2
D:\ExampleDirectory\sample directory3
D:\ExampleDirectory\sample directory4

まとめ

フォルダ内のディレクトリのみを取得するには、次の2つの方法が有効です。

  • FileFilter + listFiles():直下のディレクトリのみを取得したい場合に最適。ラムダ式を使えば簡潔に書ける。
  • Files.walk() + filter(Files::isDirectory):サブディレクトリを再帰的にたどりたい場合に便利。ストリームAPIとの相性も良い。

用途に応じて使い分けることで、ファイル操作のコードをより読みやすく、保守しやすくなります。

  1. JavaでCSVファイルを読み込む方法|BufferedReaderによる基本的なデータ読み取り手順

    CSVとは「Comma Separated Values(カンマ区切り値)」の略で、テキスト形式のデータファイルの一種です。CSVファイルでは、1行ごとに複数の項目がカンマ(,)で区切られて記録されており、拡張子は「.csv」として保存されます。表形式のデータを扱う際に広く利用されている、シンプルで汎用性の高いフォーマットです。 JavaでCSVファイルを読み込む仕組み JavaでCSVファイルを読み込むには、BufferedReaderクラスのreadLine()メソッドを使用するのが基本的な方法です。このメソッドを使うと、ファイルの内容を1行ずつ順番に読み取ることができます。 読み取った各

  2. Javaでプロパティファイルからデータを読み取る方法を解説

    JavaのPropertiesクラスは、Hashtableクラスのサブクラスであり、永続化可能なプロパティの集合(プロパティセット)を表します。Propertiesオブジェクトはストリームへ保存したり、ストリームから読み込んだりすることができます。また、プロパティリスト内の各キーとそれに対応する値は、どちらも文字列型として扱われます。Javaでは、Propertiesファイルを使うことでアプリケーションの設定情報を外部化し、キーと値(key-value)のペアとして管理できます。Propertiesクラスが提供するload()メソッドを使用すると、.propertiesファイルに記述されたキー