ディレクトリに含まれるファイルやディレクトリの一覧を取得する(Files.list,Files.walk)

Files クラスで用意されている list メソッドを使用すると、指定したディレクトリの中に含まれるファイルやディレクトリの一覧を取得することができます。また Files クラスで用意されている walk メソッドを使用すると指定した階層までサブディレクトリの中のファイルやディレクトリを取得することができます。ここでは Java を使ってディレクトリに含まれるファイルやディレクトリの一覧を取得する方法について解説します。

(Last modified: )

ファイルやディレクトリの一覧を取得する(Files.list)

Path オブジェクトが表すディレクトリの中に含まれるファイルやディレクトリの一覧を取得するには Path クラスで用意されている list メソッドを使用します。 list メソッドはクラスメソッドです。書式は次のとおりです。

public static Stream<Path> list(Path dir) throws IOException

パラメータ:
dir - ディレクトリへのパス

戻り値:
ディレクトリの内容を記述するStream

例外:
NotDirectoryException - ファイルがディレクトリではないために開けなかった場合(オプションの固有例外)
IOException - ディレクトリを開いているときに入出力エラーが発生した場合
SecurityException - デフォルト・プロバイダで、セキュリティ・マネージャがインストールされている場合は、checkReadメソッドが呼び出されてディレクトリへの読取りアクセスがチェックされます

1 番目の引数に対象となるディレクトリを表す Path オブジェクトを指定します。メソッドを実行すると、ディレクトリに含まれるファイルやディレクトリの内容が含まれる Stream オブジェクトを取得します。

次のサンプルを見てください。

Path dirpath = Paths.get("C:/code/java");

try(Stream<Path> stream = Files.list(dirpath)) {
  stream.forEach(p -> System.out.println(p.toString()));
}catch(IOException e) {
  System.out.println(e);
}

※ list メソッドについては「このメソッドは、try-with-resources文または類似の制御構造内で使用して、ストリーム操作が完了した後にストリームのオープン・ディレクトリがすぐに閉じられるようにする必要があります」という記載があります。今回は try-with-resources 文を使って記述しています。

C:\code\java ディレクトリの中に含まれるファイルやディレクトリの Path オブジェクトを順に取得し、 toString メソッドを使ってファイル名やディレクトリ名を出力しています。 list メソッドの場合はサブディレクトリの中のファイルやディレクトリまでは取得しません。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample18-1.java という名前で保存します。

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

class JSample18_1{
  public static void main(String[] args){
    Path dirpath = Paths.get("C:/code/java/file/doc");

    try(Stream<Path> stream = Files.list(dirpath)) {
      stream.forEach(p -> System.out.println(p.toString()));
    }catch(IOException e) {
      System.out.println(e);
    }
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample18_1.java

現在対象のディレクトリの中には次のようにファイルやディレクトリが含まれています。

C:\CODE\JAVA\FILE\DOC
│  memo.txt
│  report.txt
│
├─html
│      bye.html
│      hello.html
│
└─image
    │  river.jpeg
    │  stone.jpeg
    │
    └─back
            sky.jpeg

その後で、次のように実行してください。

java JSample18_1

ファイルやディレクトリの一覧を取得する(Files.list)(1)

指定したディレクトリの中に含まれるファイルおよびディレクトリの一覧を取得することができました。 list メソッドではサブディレクトリの中に含まれるファイルやディレクトリは取得できません。

ファイルやディレクトリの一覧をサブディレクトリの中まで取得する(Files.walk)

Path オブジェクトが表すディレクトリの中に含まれるファイルやディレクトリの一覧をサブディレクトリの中まで含めて取得するには Path クラスで用意されている walk メソッドを使用します。 walk メソッドはクラスメソッドです。書式は次のとおりです。

public static Stream<Path> walk(Path start, int maxDepth, FileVisitOption... options) throws IOException

パラメータ:
start - 開始ファイル
maxDepth - ビジットするディレクトリ・レベルの最大数
options - トラバースを構成するオプション

戻り値:
PathのStream

例外:
IllegalArgumentException - maxDepthパラメータが負の値の場合
SecurityException - セキュリティ・マネージャが開始ファイルへのアクセスを拒否する場合。 デフォルト・プロバイダの場合は、checkReadメソッドが呼び出されてディレクトリへの読取りアクセスがチェックされます
IOException - 開始ファイルにアクセスしているときに入出力エラーがスローされる場合

1 番目の引数に対象となるディレクトリを表す Path オブジェクトを指定します。 2 番目の引数に何階層までファイルやディレクトリを取得するのかを指定します( 1 を指定した場合は list と同じ結果になります)。メソッドを実行すると、ディレクトリに含まれるファイルやディレクトリの内容が含まれる Stream オブジェクトを取得します。

次のサンプルを見てください。

Path dirpath = Paths.get("C:/code/java");

try(Stream<Path> stream = Files.walk(dirpath, 2)) {
  stream.forEach(p -> System.out.println(p.toString()));
}catch(IOException e) {
  System.out.println(e);
}

※ walk メソッドについては「このメソッドは、try-with-resources文または類似の制御構造内で使用して、ストリーム操作が完了した後にストリームのオープン・ディレクトリがすぐに閉じられるようにする必要があります」という記載があります。今回は try-with-resources 文を使って記述しています。

C:\code\java ディレクトリの中に含まれるファイルやディレクトリの Path オブジェクトを順に取得し、 toString メソッドを使ってファイル名やディレクトリ名を出力しています。 walk メソッドの 2 番目の引数に 2 を指定しているので、サブディレクトリの中のファイルやディレクトリを取得しますが、さらにその下のサブディレクトリの中までは取得しません。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample18-2.java という名前で保存します。

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

class JSample18_2{
  public static void main(String[] args){
    Path dirpath = Paths.get("C:/code/java/file/doc");

    try(Stream<Path> stream = Files.walk(dirpath, 3)) {
      stream.forEach(p -> System.out.println(p.toString()));
    }catch(IOException e) {
      System.out.println(e);
    }
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample18_2.java

現在対象のディレクトリの中には次のようにファイルやディレクトリが含まれています。

C:\CODE\JAVA\FILE\DOC
│  memo.txt
│  report.txt
│
├─html
│      bye.html
│      hello.html
│
└─image
    │  river.jpeg
    │  stone.jpeg
    │
    └─back
            sky.jpeg

その後で、次のように実行してください。

java JSample18_2

ファイルやディレクトリの一覧を再帰的に取得する(Files.walk)(1)

指定したディレクトリの中に含まれるファイルおよびディレクトリの一覧を取得することができました。 walk メソッドの 2 番目の引数に 3 を指定しているので 3 階層分のファイルやディレクトリを取得しています。

walk メソッドの 2 番目の引数を 2 に変更した場合は 2 階層分のファイルやディレクトリを取得するため次のような結果となります。

ファイルやディレクトリの一覧を再帰的に取得する(Files.walk)(2)

違いが分かりにくいですが C:\code\java\file\doc\image\back\sky.jpeg が表示されなくなっています。

また walk メソッドの 2 番目の引数を 1 に変更した場合は 1 階層分のファイルやディレクトリを取得するため list メソッドと同じ次のような結果となります。

ファイルやディレクトリの一覧を再帰的に取得する(Files.walk)(3)

-- --

Java を使ってディレクトリに含まれるファイルやディレクトリの一覧を取得する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。