Analyse des Dienstprogramms Files.walkFileTree ();

Nachdem ich nirgendwo eine erklärende Beschreibung auf Russisch gefunden hatte, was für ein Biest Files.walkFileTree () , und es mit einem Quietschen gemeistert hatte, wie sich später herausstellte, eine einfache Funktionalität, beschloss ich, das Material mit Beispielen als Teil des Fixierens zu teilen, was ich wirklich vermisste.

Mit der walkFileTree () -Methode können Sie den Baum von Dateien und Unterverzeichnissen umgehen, die als Parameter des Path-Elements an sie übergeben wurden ...

Zwei Methodensignaturen

Files.walkFileTree(Path start, FileVisitor<? super Path> visitor); Files.walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor); 

Wo
Pfadstart - das Verzeichnis, dessen Inhalt umgangen werden soll,
FileVisitor-Besucher - Eine Instanz einer Klasse, die die FileVisitor-Schnittstelle implementiert oder von SimpleFileVisitor () erbt. Letzteres ist meiner Meinung nach bequemer zu verwenden, wenn Sie nicht alle FileVisitor () -Methoden neu definieren müssen, was etwas später erläutert wird (dies hängt jedoch von der jeweiligen Situation ab).
Festlegen von <\ FileVisitOption> -Optionen - Eine Reihe von Optionen, die das Verhalten beim Crawlen bestimmen.
maxDepth - Durchgangstiefe von Unterverzeichnissen.

Zunächst zu Parametern, die früher oder später nützlich sein werden.

maxDepth - Durchquertiefe. Bei = 0 wird der Eintrag in das Verzeichnis nicht durchgeführt, bei = MAX_VALUE wird das Verzeichnis bis zur maximalen Tiefe geprüft, bei maxDepth = 3 wird die Passage in 3 Unterverzeichnissen "down" ausgeführt.

FileVisitOption - enum ist eine Menge, die bestimmt, ob das Programm beim Crawlen symbolischen Links folgen soll (in diesem Fall wird der Wert FileVisitOption.FOLLOW_LINKS angegeben).

FileVisitor - eine Schnittstelle mit 4 Methoden:

1) FileVisitResult preVisitDirectory (T dir, BasicFileAttributes attrs) löst eine IOException aus;
Enthält eine Reihe von Methoden, die vor dem Besuch des aktuellen Unterverzeichnisses befolgt werden sollten. Über attrs können Sie beispielsweise Daten wie:
lastModifiedTime (),
lastAccessTime (),
CreationTime (),
isRegularFile () - true, wenn wir eine Datei vor uns haben,
isDirectory () - true, wenn wir ein Verzeichnis haben
isSymbolicLink () - true, wenn das Objekt ein Link ist,
isOther () - true, wenn das betreffende Objekt weder eine Datei noch ein Verzeichnis oder ein Link ist.
size () - gibt die Größe des Objekts und zurück
fileKey () - gibt einen Dateischlüssel oder null zurück;

Wenn Sie vorhaben, die Anzahl der Verzeichnisse während des Crawls zu zählen, sollten Sie nicht vergessen, dass das Startverzeichnis auch im Gesamtbetrag berücksichtigt wird.

2) FileVisitResult visitFile (T-Datei, BasicFileAttributes attrs) löst eine IOException aus.
Eine Reihe von Methoden, die beim Besuch der aktuellen Datei befolgt werden sollten (Sie können beispielsweise den Inhalt durchsuchen und nach Vorkommen der Suchzeichenfolge suchen oder das Datum des letzten Besuchs erneut ermitteln, die Datei ändern oder die Größe aller zu crawlenden Dateien hinzufügen, um die Größe des Verzeichnisses zu ermitteln.)

Beispiel

 public class MyFileVisitor extends SimpleFileVisitor<Path> { String partOfName; String partOfContent; @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { boolean containsName = true; if(partOfName!=null && !file.getFileName().toString().contains(partOfName)) containsName = false; String content = new String(Files.readAllBytes(file)); boolean containsContent = true; if(partOfContent!=null && !content.contains(partOfContent)) containsContent = false; if(containsName && containsContent) foundFiles.add(file); return FileVisitResult.CONTINUE; } 

In diesem Beispiel wird beim Durchlaufen des Dateibaums jede Datei auf gleichzeitige Ausführung von zwei Ereignissen überprüft - ob der Dateiname den gewünschten Eintrag enthält und ob die Datei Einträge der erforderlichen Zeichenfolge enthält. Wenn beide Bedingungen erfüllt sind, wird die Datei zum resultierenden Blatt hinzugefügt, wonach der Crawl fortgesetzt wird.

Oder ein anderes Beispiel für die Überlastung der visitFile-Methode

 @Override public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException { if(path.toString().endsWith(".rar") || path.toString().endsWith(".zip")) archived.add(path.toString()); return FileVisitResult.CONTINUE; } 

Das Programm fügt während eines Baumdurchlaufs beim Besuch einer Datei, falls es sich um ein Zip- oder RAR-Archiv handelt, seine Adresse (Pfad) als Zeichenfolge zur Liste der Archivdateien hinzu.

3) FileVisitResult visitFileFailed (T-Datei, IOException exc) löst IOException aus;
Diese Methode kann nützlich sein, wenn der Zugriff auf eine Datei nicht erfolgreich ist und eine Ausnahme "ausgelöst" werden kann. Der Rest kann durch die Annotation Überschreiben gelehrt werden. Berechnen Sie beispielsweise die Anzahl der Dateien, auf die nicht zugegriffen werden konnte.

Beispiel

 @Override public FileVisitResult visitFileFailed(Path path, IOException exc) throws IOException { failed.add(path.toString()); return FileVisitResult.SKIP_SUBTREE; } 

Bei einem erfolglosen Versuch, auf den Pfad zuzugreifen, wird dieser Pfad als Zeichenfolge zur fehlgeschlagenen Liste ähnlicher hinzugefügt, und das Programm wird weiterhin umgangen, ohne das Unterverzeichnis aufzurufen.

4) FileVisitResult postVisitDirectory (T dir, IOException exc) löst IOException aus;
Alles, was nach dem Besuch des Verzeichnisses getan werden muss, muss als Teil der Überladung dieser Methode aufgelistet werden. Wenn Sie beispielsweise ein Verzeichnis durchsuchen und alle darin enthaltenen Dateien zerstören, kann diese Methode es auch selbst zerstören (wir erinnern uns, dass Files.delete (Pfadverzeichnis) das Verzeichnis nur löscht, wenn es leer ist und keine Dateien enthält).

Beispiel

 @Override public FileVisitResult postVisitDirectory(Path path, IOException exc) throws IOException { Files.delete(path); return FileVisitResult.CONTINUE; } 

Alle oben beschriebenen Methoden werden abgeschlossen, indem die "Besuchsergebnisse" (FileVisitResult) des Objekts zurückgegeben werden, die zum Aufzählungssatz gehören und die folgenden Werte annehmen können:

  1. CONTINUE - fährt fort, den Baum zu durchqueren;
  2. TERMINATE - TERMINATE die Baumdurchquerung.
  3. SKIP_SUBTREE - wird weiterhin umgangen, ohne in dieses Verzeichnis zu SKIP_SUBTREE .
  4. SKIP_SIBLINGS - schließt das SKIP_SIBLINGS der "Verwandten" dieser Datei oder dieses Verzeichnisses aus;

Source: https://habr.com/ru/post/de437694/


All Articles