Javaでディレクトリを提供するすべてのサブディレクトリを一覧表示します
この投稿では、Javaでディレクトリを提供するすべてのサブディレクトリを一覧表示する方法について説明します。
1.使用する File#list()
方法
The File#list()
メソッドは、指定されたファイル名フィルターを満たすディレクトリ内のファイルとディレクトリを取得するために使用されます。あなたはオーバーライドすることができます accept()
の方法 FilenameFilter
指定されたファイルをファイルリストに含める必要がある場合はtrueを返します。それ以外の場合はfalse。すべてのサブディレクトリを一覧表示するには、ファイルがディレクトリである場合にのみtrueを返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import java.io.File; import java.io.FilenameFilter; import java.util.Arrays; public class Main { public static void main(String[] args) { String path = "/path/to/dir"; File file = new File(path); String[] directories = file.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return new File(dir, name).isDirectory(); } }); System.out.println(Arrays.toString(directories)); } } |
上記のコードは、以下に示すように、Java8ラムダでさらに短縮できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
import java.io.File; import java.util.Arrays; public class Main { public static void main(String[] args) { String path = "/path/to/dir"; File file = new File(path); String[] directories = file.list((dir, name) -> new File(dir, name).isDirectory()); System.out.println(Arrays.toString(directories)); } } |
2.使用する File#listFiles()
方法
また、使用することができます File#listFiles()
指定されたファイルフィルターを満たす、指定されたディレクトリ内のファイルとディレクトリのパス名リストを取得するメソッド。あなたはオーバーライドすることができます accept()
の方法 FileFilter
指定されたパス名を出力に含める必要があるかどうかをチェックします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.io.File; import java.io.FileFilter; import java.util.Arrays; public class Main { public static void main(String[] args) { String path = "/path/to/dir"; File[] directories = new File(path).listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory(); } }); System.out.println(Arrays.toString(directories)); } } |
上記のコードは、メソッド参照を使用する次のコードと同等です。
1 2 3 4 5 6 7 8 9 10 11 |
import java.io.File; import java.util.Arrays; public class Main { public static void main(String[] args) { String path = "/path/to/dir"; File[] directories = new File(path).listFiles(File::isDirectory); System.out.println(Arrays.toString(directories)); } } |
3.使用する DirectoryStream
または、 DirectoryStream
ある条件を満たすディレクトリ内のファイルを反復処理します。ディレクトリのみをフィルタリングするための簡単な使用例を次に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; public class Main { public static void main(String[] args) { String path = "/path/to/dir"; try (DirectoryStream<Path> ds = Files.newDirectoryStream( FileSystems.getDefault().getPath(path), Files::isDirectory)) { for (Path p : ds) { System.out.println(p.getFileName()); } } catch (IOException e) { e.printStackTrace(); } } } |
4.使用する Files.walk()
方法
アクセスするディレクトリレベルの最大数を制限する必要がある場合は、 Files.walk()
を返すメソッド Stream<Path>
。 JDK1.8以降で使用できます。すべてのレベルを訪問するには、合格することができます Integer.MAX_VALUE
価値。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) throws IOException { String path = "/path/to/dir"; List<Path> dirs = Files.walk(Paths.get(path), 1) .filter(Files::isDirectory) .collect(Collectors.toList()); System.out.println(dirs); } } |
これで、Javaのディレクトリに存在するすべてのサブディレクトリを一覧表示できます。