回答:
Fileクラスを使用して、ディレクトリを一覧表示できます。
File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
});
System.out.println(Arrays.toString(directories));
更新
この投稿に対する著者からのコメントは、より速い方法、ここでの素晴らしい議論を望んでいました:Javaでディレクトリのリストをすばやく 取得する方法は?
基本的に:
非常にシンプルなJava 8ソリューション:
File[] directories = new File("/your/path/").listFiles(File::isDirectory);
FileFilterを使用するのと同じです(古いJavaでも動作します)。
File[] directories = new File("/your/path/").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory();
}
});
::
この場合、二重コロンはどのように機能しますか?
@Mohamed Mansourあなたはほとんどそこにいました...あなたが使用していたことからの「dir」引数は実際には現在のパスなので、常にtrueを返します。子がサブディレクトリかどうかを確認するには、その子をテストする必要があります。
File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
});
System.out.println(Arrays.toString(directories));
Java 7とNIO.2を使用するソリューションに興味がある場合は、次のようになります。
private static class DirectoriesFilter implements Filter<Path> {
@Override
public boolean accept(Path entry) throws IOException {
return Files.isDirectory(entry);
}
}
try (DirectoryStream<Path> ds = Files.newDirectoryStream(FileSystems.getDefault().getPath(root), new DirectoriesFilter())) {
for (Path p : ds) {
System.out.println(p.getFileName());
}
} catch (IOException e) {
e.printStackTrace();
}
ArrayList<File> directories = new ArrayList<File>(
Arrays.asList(
new File("your/path/").listFiles(File::isDirectory)
)
);
Java 7とNIOにも興味がある場合は、上記の@vooの回答に対する代替ソリューションがあります。呼び出しを行うtry-with-resourcesとFiles.find()
、ディレクトリのフィルタリングに使用されるラムダ関数を使用できます。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
final Path directory = Paths.get("/path/to/folder");
try (Stream<Path> paths = Files.find(directory, Integer.MAX_VALUE, (path, attributes) -> attributes.isDirectory())) {
paths.forEach(System.out::println);
} catch (IOException e) {
...
}
lambda関数を変更して、名前でディレクトリをフィルタリングすることもできます。
(path, attributes) -> attributes.isDirectory() && path.toString().contains("test")
または日付順:
final long now = System.currentTimeMillis();
final long yesterday = new Date(now - 24 * 60 * 60 * 1000L).getTime();
// modified in the last 24 hours
(path, attributes) -> attributes.isDirectory() && attributes.lastModifiedTime().toMillis() > yesterday
java.io.File機能を使用したいのですが、
2012年(質問の日付)はい、今日ではありません。 java.nio
APIは、このような要件に対応する必要があります。
非常に多くの回答がありますが、私がそれを使用する単純な方法ではありませんFiles.walk().filter().collect()
。
グローバルに2つのアプローチが可能です。
1)制限Files.walk(Path start, )
はありませんmaxDepth
が
2)Files.walk(Path start, int maxDepth, FileVisitOption... options)
それを設定することができます。
深さの制限を指定しないと、次のようになります。
Path directory = Paths.get("/foo/bar");
try {
List<Path> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
そして、レガシーな理由で、あなたがリストを取得する必要があるなら、File
あなたは単にmap(Path::toFile)
収集の前に操作を追加することができます:
Path directory = Paths.get("/foo/bar");
try {
List<File> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.map(Path::toFile)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
Files.list(Path)
おそらくと同じものもありFiles.walk(Path,1)
ます。
Files.list(Path)
は、フォルダーを再帰的に繰り返したくない場合の公正な代替手段です。フォルダを再帰的に繰り返すには、walk()
より適しています。
私のために働いた解決策は、答えのリストから欠落しています。したがって、私はこのソリューションをここに投稿しています:
File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());
ここではorg.apache.commons.io.filefilter.FileFilterUtils
、Apache commons-io-2.2.jarから使用しています。ドキュメントはこちらから入手できます:https : //commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/filefilter/FileFilterUtils.html
開始ディレクトリが String
String
パスをパラメーターとして取るメソッドを作成します。メソッド内:listFiles
メソッドを使用して、現在のディレクトリにあるファイルの配列を取得しますこれが私のコードの解決策です。私は最初の答えから少し変更しました。これにより、目的のディレクトリにあるすべてのフォルダが1行ずつ表示されます。
try {
File file = new File("D:\\admir\\MyBookLibrary");
String[] directories = file.list(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
});
for(int i = 0;i < directories.length;i++) {
if(directories[i] != null) {
System.out.println(Arrays.asList(directories[i]));
}
}
}catch(Exception e) {
System.err.println("Error!");
}