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

Javaでディレクトリとネストされたサブディレクトリ内の全ファイルを再帰的に一覧表示する方法

Javaでは、java.io.FileクラスのlistFiles()メソッドを再帰的に呼び出すことで、指定したディレクトリだけでなく、その中にネストされたサブディレクトリ内のすべてのファイルを一覧表示できます。以下は、階層構造(インデント)付きですべてのファイルとフォルダを出力するJavaプログラムの一例です。

サンプルコード

import java.io.File;
public class Demo{
   static void print_recursively(File[] my_arr,int my_index,int sub_level){
      if(my_index == my_arr.length)
         return;
      for (int i = 0; i < sub_level; i++)
         System.out.print("\t");
      if(my_arr[my_index].isFile())
         System.out.println(my_arr[my_index].getName());
      else if(my_arr[my_index].isDirectory()){
         System.out.println("[" + my_arr[my_index].getName() + "]");
         print_recursively(my_arr[my_index].listFiles(), 0, sub_level + 1);
      }
      print_recursively(my_arr,++my_index, sub_level);
   }
   public static void main(String[] args){
      String path_main = "path to folder that contains files";
      File main_dir = new File(path_main);
      if(main_dir.exists() && main_dir.isDirectory()){
         File my_arr[] = main_dir.listFiles();
         System.out.println("Files listed from the main directory are : " + main_dir);
         print_recursively(my_arr,0,0);
      }
   }
}

実行結果

このプログラムを実行すると、指定したディレクトリパス内にあるすべての形式のファイルが、ネストの深さに応じてインデントされながらコンソールに出力されます。サブディレクトリは [フォルダ名] のように角括弧で囲まれて表示されるため、フォルダ構成がひと目で把握できます。

プログラムの仕組み

print_recursivelyメソッドの役割

Demoクラスには、print_recursivelyという再帰処理用のメソッドが定義されています。このメソッドは、次の3つの引数を受け取ります。

  • my_arr … 処理対象となるFileオブジェクトの配列
  • my_index … 現在処理している要素のインデックス番号
  • sub_level … ネストの深さ(インデントの階層数)

メソッドは配列の要素を先頭から順に走査し、要素がファイルであればその名前を出力します。一方、要素がディレクトリだった場合は、名前を角括弧で囲んで表示したうえで、自分自身を再度呼び出してその中身をさらに掘り下げていきます。この再帰処理により、どれほど深くネストされたサブディレクトリ内のファイルでも、漏れなくすべて一覧表示することができます。

mainメソッドの処理の流れ

  1. 一覧表示したいフォルダへのパスを文字列として定義します。
  2. そのパスをもとに、新しいFileオブジェクトを生成します。
  3. exists()メソッドとisDirectory()メソッドを使い、パスが実際に存在し、かつそれがディレクトリであることを確認します。
  4. listFiles()メソッドを呼び出して、そのフォルダ内のすべてのファイルとサブディレクトリをFile配列として取得します。
  5. print_recursivelyメソッドに初期値(インデックス0、階層0)を渡して呼び出し、一覧結果をコンソールに表示します。

補足:もっと簡単に書く方法はある?

なお、Java 8以降ではFiles.walk()メソッドやStream APIを組み合わせることで、同じ処理をより短いコードで実現することも可能です。ただし、階層の深さに応じたインデントや出力形式を自由にカスタマイズしたい場合は、本記事のような再帰的な実装の方が柔軟性が高くおすすめです。

  1. 【Java入門】ディレクトリ内のすべてのファイルを再帰的に削除するプログラムの書き方

    この記事では、Javaを使って指定したディレクトリ内のすべてのファイルを再帰的に削除する方法を解説します。サブディレクトリの中にあるファイルも含めて、ファイルだけを削除し、ディレクトリ構造自体は残すプログラムです。前提となるディレクトリ構成まず、Dドライブ直下に ExampleDirectory というフォルダがあり、その中に7つのファイルと2つのディレクトリが含まれているものと仮定します。SampleDirectory1:SampleFile1.txt と SampleFile2.txt の2つのファイルを含むSampleDirectory2:SampleFile2.txt と Sample

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

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