Wie liste ich in Java nur Unterverzeichnisse aus einem Verzeichnis auf?
Ich möchte die Funktion java.io.File verwenden. Was ist die beste Methode in Java, um dies zu tun?
Wie liste ich in Java nur Unterverzeichnisse aus einem Verzeichnis auf?
Ich möchte die Funktion java.io.File verwenden. Was ist die beste Methode in Java, um dies zu tun?
Antworten:
Mit der File- Klasse können Sie die Verzeichnisse auflisten.
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));
Aktualisieren
Kommentar des Autors zu diesem Beitrag wollte einen schnelleren Weg, tolle Diskussion hier: Wie kann man eine Liste von Verzeichnissen SCHNELL in Java abrufen?
Grundsätzlich:
Eine sehr einfache Java 8-Lösung:
File[] directories = new File("/your/path/").listFiles(File::isDirectory);
Dies entspricht der Verwendung eines FileFilter (funktioniert auch mit älterem Java):
File[] directories = new File("/your/path/").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory();
}
});
::
in diesem Fall?
@Mohamed Mansour du warst fast da ... das "dir" Argument, das du benutzt hast, ist eigentlich der aktuelle Pfad, also wird es immer true zurückgeben. Um festzustellen, ob das Kind ein Unterverzeichnis ist oder nicht, müssen Sie dieses Kind testen.
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));
Wenn Sie an einer Lösung mit Java 7 und NIO.2 interessiert sind, könnte dies folgendermaßen aussehen:
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)
)
);
Für diejenigen, die sich auch für Java 7 und NIO interessieren, gibt es eine alternative Lösung zu der obigen Antwort von @ voo . Wir können einen Try-with-Resources- Aufruf verwenden Files.find()
und eine Lambda-Funktion, mit der die Verzeichnisse gefiltert werden.
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) {
...
}
Wir können Verzeichnisse sogar nach Namen filtern, indem wir die Lambda-Funktion ändern:
(path, attributes) -> attributes.isDirectory() && path.toString().contains("test")
oder nach Datum:
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
Ich möchte die Funktionalität java.io.File verwenden.
Im Jahr 2012 (Datum der Frage) ja, nicht heute. java.nio
API muss für solche Anforderungen bevorzugt werden.
Schrecklich mit so vielen Antworten, aber nicht so einfach, wie ich das verwenden würde Files.walk().filter().collect()
.
Global sind zwei Ansätze möglich:
1) Files.walk(Path start, )
hat keine maxDepth
Einschränkungen während
2) Files.walk(Path start, int maxDepth, FileVisitOption... options)
erlaubt es einzustellen.
Ohne Angabe einer Tiefenbeschränkung würde dies Folgendes ergeben:
Path directory = Paths.get("/foo/bar");
try {
List<Path> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
Und wenn Sie aus alten Gründen eine Liste benötigen, File
können Sie map(Path::toFile)
vor dem Sammeln einfach eine Operation hinzufügen :
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)
was wohl das gleiche ist wie Files.walk(Path,1)
.
Files.list(Path)
ist eine faire Alternative, wenn wir keine rekursiven Ordner iterieren möchten. Ordner rekursiv zu iterieren, walk()
passt besser.
Die Lösung, die für mich funktioniert hat, fehlt in der Liste der Antworten. Daher poste ich diese Lösung hier:
File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());
Hier habe ich org.apache.commons.io.filefilter.FileFilterUtils
von Apache commons-io-2.2.jar verwendet. Die Dokumentation finden Sie hier: https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/filefilter/FileFilterUtils.html
Gegeben ein Startverzeichnis als String
String
Pfad als Parameter verwendet. In der Methode:listFiles
Methode ein Array von Dateien im aktuellen Verzeichnis abHier ist eine Lösung für meinen Code. Ich habe gerade eine kleine Änderung von der ersten Antwort gemacht . Dadurch werden alle Ordner zeilenweise nur im gewünschten Verzeichnis aufgelistet:
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!");
}