wake-up-neo.net

Java, Listet nur Unterverzeichnisse eines Verzeichnisses auf, keine Dateien

Wie kann ich in Java nur Unterverzeichnisse aus einem Verzeichnis auflisten?

Ich möchte die Java.io.File-Funktion verwenden. Was ist die beste Methode in Java, um dies zu tun? 

76
Lokesh Paunikar

Sie können die File class verwenden, um die Verzeichnisse aufzulisten.

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));

Update

Kommentar des Autors zu diesem Beitrag wollte einen schnelleren Weg, großartige Diskussion hier: Wie kann man eine Liste von Verzeichnissen schnell in Java abrufen?

Grundsätzlich gilt:

  1. Wenn Sie die Dateistruktur kontrollieren, würde ich versuchen, in diese Situation zu geraten.
  2. In Java NIO.2 können Sie die Verzeichnisfunktion verwenden, um einen Iterator zurückzugeben, um eine größere Skalierung zu ermöglichen. Die Directory-Stream-Klasse ist ein Objekt, mit dem Sie die Einträge in einem Verzeichnis durchlaufen können.
116
Mohamed Mansour

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();
    }
});
86
headsvk

@Mohamed Mansour du warst fast da ... das "dir" -Argument, das du benutzt hast, ist eigentlich der kurvenreiche Pfad, also wird es immer wahr sein. Um zu sehen, 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));
13
Javier Buzzi

Falls 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();
    }
7
voo
ArrayList<File> directories = new ArrayList<File>(
    Arrays.asList(
        new File("your/path/").listFiles(File::isDirectory)
    )
);
1
bcangas97

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

0
Abhishek Oza

Ich möchte die Java.io.File-Funktionalität nutzen,

2012 (Datum der Frage) ja, heute nicht. Java.nio API muss für solche Anforderungen bevorzugt werden.

Schrecklich mit so vielen Antworten, aber nicht der einfache Weg, den ich benutzen würde, ist Files.walk().filter().collect().

Global sind zwei Ansätze möglich:

1) Files.walk(Path start, ) hat währenddessen keine maxDepth Einschränkungen

2) Files.walk(Path start, int maxDepth, FileVisitOption... options) ermöglicht die Einstellung.

Ohne Angabe einer Tiefenbegrenzung würde es geben:

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 älteren Gründen eine Liste von File benötigen, können Sie vor dem Sammeln einfach eine map(Path::toFile) -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
}
0
davidxxx

Ein Startverzeichnis als String angegeben

  1. Erstellen Sie eine Methode, die einen String-Pfad als Parameter verwendet. In der Methode:
  2. Erstellen Sie ein neues File object basierend auf dem Startverzeichnis
  3. Rufen Sie mit der Methode listFiles ein Array von Dateien im aktuellen Verzeichnis ab
  4. Schleife über das Array von Dateien
    1. Wenn es sich um eine Datei handelt, fahren Sie mit der Schleife fort
    2. Wenn es sich um ein Verzeichnis handelt, drucken Sie den Namen und recurse in diesem neuen Verzeichnispfad aus
0
Jonathon Faust

Hier ist die Lösung für meinen Code. Ich habe gerade eine kleine Änderung von der ersten Antwort vorgenommen. Dadurch werden alle Ordner nur im gewünschten Verzeichnis zeilenweise 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!");
        }
0
Tabby Auguste

Für diejenigen, die auch an Java 7 und NIO interessiert sind, gibt es eine alternative Lösung zu @ voo's Antwort oben . Wir können ein try-with-resources verwenden, das Files.find() aufruft, 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 Sie 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
0
HugoTeixeira