2013-05-06 6 views
12

Ich mache ein paar Nachforschungen über Java NIO.2 und seine Dateioperationen, und derzeit spiele ich mit Filetree-Walking-Funktionen und -Klassen.Warum ist der NIO.2 FileVisitor-Typ generisch?

NIO.2 FileVisitor API ist wunderbar, es ist eine Schande, dass solche Dinge erst kürzlich, vor zehn Jahren, in Java SE hinzugefügt wurden. Es gibt jedoch etwas, was mich etwas stört: Was ist der Zweck, FileVisitor Schnittstelle generisch zu machen?

Jedes Beispiel auf dem Netz zeigt, wie es mit Files.walkFileTree() zu verwenden, die, dass wir FileVisitor<Path> Typen verwenden impliziert. Aber ich kann einfach keine Verwendung für diese Schnittstelle für andere Dinge als Path sehen. Nun, es kannFileVisitor möglich sein, andere Arten von Bäumen zu gehen (In-Memory-Einsen?), Aber das fühlt sich nicht richtig an: diese Schnittstelle und verwandte Klassen haben sehr spezifische Namen semantisch an Dateien gebunden, und auch FileVisitor 's Methoden werfen IOException s.

Also, gab es irgendwelche Gründe für die Parametrisierung FileVisitor Typ?

+0

Speculation: 'FileVisitor' auch verwendbar sein kann, andere Dateisysteme zugreifen, z.B. [HDFS] (http://en.wikipedia.org/wiki/HDFS#Hadoop_Distributed_File_System). – ValarDohaeris

Antwort

5

Mit Generics kann die gleiche Schnittstelle für andere Typen von Pfade verwendet werden. Wie in dem folgende (vereinfachte) Codefragment gezeigt, arbeitet die Schnittstelle schön mit java.io.File:

FileVisitResult walk(File file, FileVisitor<File> visitor) 
    throws IOException 
{ 
    if (file.isDirectory()) { 
     visitor.preVisitDirectory(file, null); 
     for (File child : file.listFiles()) { 
      walk(child, visitor); 
     } 
     return visitor.postVisitDirectory(file, null); 
    } else { 
     return visitor.visitFile(file, null); 
    } 
} 
+0

Ja, genau das ist es, woran ich einige Minuten nach dem Schreiben der Frage gedacht habe, dass es möglich ist, 'FileVisitor' auf normale' '' '' 'Dateien anzuwenden. –

+0

Aber 'null's als Attributobjekte sehen traurig aus ... –

5

Verwenden Sie GitHub? Dies wäre eine perfekte Gelegenheit, die FileVisitor zu verwenden, um eine API zu GitHub zu implementieren, mit der Sie GitHub-Projekte erkunden/visualisieren können. Aus diesem Grund könnte fast jedes SCC-System eine andere Klasse als Datei-Locator verwenden.

Und wie wäre es mit einem FileVisitor<ZipEntry> zum Durchlaufen von Zip-Dateien.

Wenn eine API potenziell mit mehreren Objekten als Ziel verwendet werden kann, ist es sinnvoll, sie generisch zu machen. Ich denke nicht es generisch zu machen wäre der Fehler, der als dumm betrachtet werden sollte.

+0

Danke, VCSes sind wirklich sehr gutes Beispiel für 'FileVisitor' Anwendung. Die 'FileVisitor'-Schnittstelle sieht jedoch wirklich halb-generisch aus; Ja, es wird durch * path * type parametrisiert, aber warum wird es auch nicht durch * attributes * type parametrisiert? Es verwendet 'BasicFileAttributes' immer. 'IOException' scheint auch irgendwie einschränkend zu sein. Und auch 'FileVisitor ' erfordert eine ausgeklügelte Logik, da die ZIP-Dateistruktur, wie sie von 'ZipInputStream' bereitgestellt wird, flach ist und Einträge in der richtigen Reihenfolge nicht enthalten kann. –

+0

@VladimirMatveev - Welche Attribute würden Sie von einem Mercurial/Git/SVN VCS präsentieren? Wäre es nicht wesentlich anders als ein HFS? Zip-Dateien sind auch nicht flach. Sie können die Entsprechung von Verzeichnissen in Zips haben - das sind ZIP-Dateien. Zip eine Zip-Datei in eine Zip-Datei und Sie haben das Äquivalent eines Ordners. – OldCurmudgeon

+0

Nun, VCS-Dateisysteme können Revisionsinformationen für jede Datei, Diffs, Änderungsprotokolle usw. liefern - das alles ist Metainformation, nicht wahr? Und Zip-Dateien in Zip-Dateien sind wirklich seltsam, nie in der Praxis getroffen. AFAIK alle aktuellen Archivierer stellen Verzeichnisse als Pfade dar, die durch Schrägstriche getrennt sind. Dies ruiniert das Beispiel nicht, obwohl solche Archive das Dateisystem wirklich modellieren können. –