Wie durchlaufe ich die Dateien in einem Verzeichnis und seinen Unterverzeichnissen in Java?

Lesezeit: 5 Minuten

Wie durchlaufe ich die Dateien in einem Verzeichnis und seinen
James

Ich brauche eine Liste aller Dateien in einem Verzeichnis, einschließlich der Dateien in allen Unterverzeichnissen. Was ist der Standardweg, um eine Verzeichnisiteration mit Java zu erreichen?

Wie durchlaufe ich die Dateien in einem Verzeichnis und seinen
BalusC

Sie können verwenden File#isDirectory() um zu testen, ob die angegebene Datei (Pfad) ein Verzeichnis ist. Wenn das ist truedann rufst du einfach dieselbe Methode noch einmal mit its auf File#listFiles() Ergebnis. Das nennt man Rekursion.

Hier ist ein einfaches Kickoff-Beispiel:

package com.stackoverflow.q3154488;

import java.io.File;

public class Demo {

    public static void main(String... args) {
        File dir = new File("/path/to/dir");
        showFiles(dir.listFiles());
    }

    public static void showFiles(File[] files) {
        for (File file : files) {
            if (file.isDirectory()) {
                System.out.println("Directory: " + file.getAbsolutePath());
                showFiles(file.listFiles()); // Calls same method again.
            } else {
                System.out.println("File: " + file.getAbsolutePath());
            }
        }
    }
}

Beachten Sie, dass dies empfindlich ist StackOverflowError wenn der Baum tiefer ist als der Stack der JVM halten kann. Wenn Sie bereits Java 8 oder neuer verwenden, verwenden Sie besser Files#walk() stattdessen die nutzt Schwanzrekursion:

package com.stackoverflow.q3154488;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class DemoWithJava8 {

    public static void main(String... args) throws Exception {
        Path dir = Paths.get("/path/to/dir");
        Files.walk(dir).forEach(path -> showFile(path.toFile()));
    }

    public static void showFile(File file) {
        if (file.isDirectory()) {
            System.out.println("Directory: " + file.getAbsolutePath());
        } else {
            System.out.println("File: " + file.getAbsolutePath());
        }
    }
}

  • danke Balus, hast du eine Idee, wie tief das als allgemeine Vermutung sein könnte?

    – James

    1. Juli 2010 um 2:56 Uhr

  • Hängt von den Speichereinstellungen Ihrer JVM ab. Aber im Allgemeinen so etwas wie ein paar Tausend. Wenn Sie glauben, dass Sie jemals auf ein solches Verzeichnis stoßen könnten, verwenden Sie keine Rekursion.

    – Mike Baranczak

    1. Juli 2010 um 4:06 Uhr

  • Dies ist anfällig für a NullPointerException wenn sich das Dateisystem zwischen dem Aufruf ändert isDirectory und listFiles wie passieren könnte, wenn System.out.println Blöcke oder du hast einfach nur Pech. Prüfen, ob die Ausgabe von listFiles nicht null ist, würde diese Racebedingung lösen.

    – Mike Samuel

    20. April 2014 um 18:00 Uhr


  • @MikeSamuel – Wenn das Verzeichnis Zehntausende von kleinen Dateien mit großen Namen enthält und Sie alle Dateinamen gleichzeitig in einem Array speichern, könnte JVM der Speicher ausgehen, oder? Gibt es also eine Möglichkeit, einzeln oder in kleinen Chargen zu iterieren?

    – Erran Morad

    5. Oktober 2014 um 1:03 Uhr


  • @BoratSagdiyev, Verwenden Sie nicht die alten Java-Datei-APIs, aber wenn Sie sich auf einer modernen JVM befinden, dann die java.nio.file.DirectoryStream ermöglicht es Ihnen, über ein Verzeichnis zu iterieren, und könnte so implementiert werden, dass es einen geringen Speicherbedarf hat, aber die einzige Möglichkeit, dies mit Sicherheit zu sagen, besteht darin, die Speichernutzung auf einer bestimmten Plattform zu überwachen.

    – Mike Samuel

    5. Oktober 2014 um 3:14 Uhr


1646177828 929 Wie durchlaufe ich die Dateien in einem Verzeichnis und seinen
clstrfsck

Wenn Sie Java 1.7 verwenden, können Sie verwenden java.nio.file.Files.walkFileTree(...).

Zum Beispiel:

public class WalkFileTreeExample {

  public static void main(String[] args) {
    Path p = Paths.get("/usr");
    FileVisitor<Path> fv = new SimpleFileVisitor<Path>() {
      @Override
      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
          throws IOException {
        System.out.println(file);
        return FileVisitResult.CONTINUE;
      }
    };

    try {
      Files.walkFileTree(p, fv);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

Wenn Sie Java 8 verwenden, können Sie die Stream-Schnittstelle mit verwenden java.nio.file.Files.walk(...):

public class WalkFileTreeExample {

  public static void main(String[] args) {
    try (Stream<Path> paths = Files.walk(Paths.get("/usr"))) {
      paths.forEach(System.out::println);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

  • Gibt es eine Möglichkeit, mit den Streams einen Prüfpunkt zu setzen, wenn ein neues Verzeichnis durchlaufen wird, und eine Funktion auszuführen?

    – Raghu DV

    26. Dezember 2017 um 15:03 Uhr

  • Files.walk(somePath) führt Sie durch den gesamten Datei- und Verzeichnisbaum, auf den von diesem Stammverzeichnis aus zugegriffen werden kann. Wenn Sie nur bestimmte Dateien verarbeiten müssen, dh nach ihrer Erweiterung, können Sie a verwenden filter mit PathMatcher die Sie konfiguriert haben glob:**.xml dh alle Nicht-XML-Dateien in späteren Stadien der Pipeline wegzulassen

    – Roman Vottner

    4. Februar 2021 um 13:47 Uhr

1646177828 42 Wie durchlaufe ich die Dateien in einem Verzeichnis und seinen
Ben J

Probier das aus FileUtils Klasse in Apache Commons – speziell iterateFiles:

Ermöglicht die Iteration über die Dateien in einem bestimmten Verzeichnis (und optional seinen Unterverzeichnissen).

  • Diese API streamt nicht wirklich (wenn Sie sich für die Mem-Nutzung interessieren), sie generiert zuerst eine Sammlung und gibt dann einen Iterator darüber zurück: return listFiles(directory, fileFilter, dirFilter).iterator();

    – Gili Nachum

    29. November 2013 um 16:28 Uhr

  • Gute Option für Java 1.6.

    – David I.

    19. März 2015 um 20:36 Uhr

  • Stimme @GiliNachum zu. FileUtils von Apache sammelt zunächst alle Dateien und gibt einen Iterator für sie aus. Es ist schädlich für die Ressourcen, wenn Sie eine große Menge an Dateien haben.

    – Bogdan Samondros

    18. Februar 2019 um 14:18 Uhr

1646177829 838 Wie durchlaufe ich die Dateien in einem Verzeichnis und seinen
fjkjava

Verwenden org.apache.commons.io.FileUtils

File file = new File("F:/Lines");       
Collection<File> files = FileUtils.listFiles(file, null, true);     
for(File file2 : files){
    System.out.println(file2.getName());            
} 

Verwenden Sie false, wenn Sie keine Dateien aus Unterverzeichnissen möchten.

Für Java 7+ gibt es das auch https://docs.oracle.com/javase/7/docs/api/java/nio/file/DirectoryStream.html

Beispiel aus dem Javadoc:

List<Path> listSourceFiles(Path dir) throws IOException {
   List<Path> result = new ArrayList<>();
   try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{c,h,cpp,hpp,java}")) {
       for (Path entry: stream) {
           result.add(entry);
       }
   } catch (DirectoryIteratorException ex) {
       // I/O error encounted during the iteration, the cause is an IOException
       throw ex.getCause();
   }
   return result;
}

1646177829 858 Wie durchlaufe ich die Dateien in einem Verzeichnis und seinen
duffymo

Es ist ein Baum, also ist Rekursion Ihr Freund: Beginnen Sie mit dem übergeordneten Verzeichnis und rufen Sie die Methode auf, um ein Array von untergeordneten Dateien zu erhalten. Durchlaufen Sie das untergeordnete Array. Wenn der aktuelle Wert ein Verzeichnis ist, übergeben Sie ihn an einen rekursiven Aufruf Ihrer Methode. Wenn nicht, verarbeiten Sie die Blattdatei entsprechend.

Wie durchlaufe ich die Dateien in einem Verzeichnis und seinen
Jan Nielsen

Wie bereits erwähnt, handelt es sich hierbei um ein Rekursionsproblem. Insbesondere können Sie sich ansehen

listFiles() 

In der Java-Datei-API Hier. Es gibt ein Array aller Dateien in einem Verzeichnis zurück. Verwenden Sie dies zusammen mit

isDirectory()

um zu sehen, ob Sie weiter rekursieren müssen, ist ein guter Anfang.

  • Dies Verknüpfung kann von Nutzen sein, da die in der Antwort defekt ist.

    – Donglecow

    7. Juni 2017 um 9:43 Uhr

906040cookie-checkWie durchlaufe ich die Dateien in einem Verzeichnis und seinen Unterverzeichnissen in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy