2013-05-06 7 views
12

Sto facendo qualche ricerca su Java NIO.2 e le sue operazioni sui file, e attualmente sto giocando con le funzioni e le classi di passeggio del filetto.Perché il tipo NI.2 FileVisitor è generico?

NIO.2 FileVisitor API è meraviglioso, è un peccato che tale cosa è stata aggiunta a Java SE solo di recente, non dieci anni fa. Tuttavia, c'è qualcosa che mi disturba leggermente: che senso ha rendere l'interfaccia FileVisitor generica?

Ogni singolo esempio in rete mostra come utilizzarlo con Files.walkFileTree() che implica che stiamo usando il tipo FileVisitor<Path>. Ma non riesco a vedere alcun utilizzo per questa interfaccia per cose diverse da Path. Bene, è possibile usare FileVisitor per camminare su altri tipi di alberi (quelli in memoria?), Ma questo non sembra giusto: questa interfaccia e le classi correlate hanno nomi molto specifici semanticamente legati ai file, e anche I metodi di FileVisitor lanciano IOException s.

Quindi, c'erano dei motivi per parametrizzare il tipo FileVisitor?

+0

speculazione: 'FileVisitor' può anche essere utilizzabile per accedere ad altri file system, ad esempio [HDFS] (http://en.wikipedia.org/wiki/HDFS#Hadoop_Distributed_File_System). – ValarDohaeris

risposta

5

Con i generici la stessa interfaccia può essere utilizzata per altri tipi di percorsi . Come mostrato nel seguente (semplificato) frammento di codice, l'interfaccia funziona bello con 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

Sì, è esattamente quello che pensavo di diversi minuti dopo aver scritto la domanda, che è possibile applicare 'FileVisitor' a' File's regolari. –

+0

Ma 'null's come oggetti attributi sembrano tristi ... –

5

Utilizzi GitHub? Questa sarebbe l'occasione perfetta per utilizzare lo FileVisitor per implementare un'API su GitHub che ti consenta di esplorare/visualizzare i progetti GitHub. Per questo motivo, quasi tutti i sistemi SCC potrebbero utilizzare una classe diversa come il localizzatore di file

E come usare un file zip FileVisitor<ZipEntry>.

Se un'API è potenzialmente utilizzabile con più oggetti come destinazione, ha senso renderla generica. Penso che non rendere generico sarebbe l'errore che dovrebbe essere considerato sciocco.

+0

Grazie, VCSes sono davvero un ottimo esempio di applicazione 'FileVisitor'. Tuttavia, l'interfaccia di 'FileVisitor' sembra davvero semi-generica; sì, è parametrizzato dal tipo * path *, ma perché non è parametrizzato anche dal tipo * attributes *? Usa sempre 'BasicFileAttributes'. 'IOException' sembra anche un po 'limitante. E anche 'FileVisitor ' richiederà una logica sofisticata poiché la struttura del file ZIP fornita da 'ZipInputStream' è piatta e potrebbe non contenere voci nell'ordine corretto. –

+0

@VladimirMatveev - Quali attributi presenteresti da un VCS Mercurial/Git/SVN? Non sarebbe significativamente diverso da un HFS? Inoltre, i file zip non sono affatto piatti. Puoi avere l'equivalente delle directory in formato zip: sono file zip. Zip un file zip in un zip e si ha l'equivalente di una cartella. – OldCurmudgeon

+0

Bene, i filesystem VCS possono fornire informazioni di revisione per ogni file, diff, cambio log ecc. - tutto questo è metainformazione, non è vero? E i file zip all'interno dei file zip sono davvero strani, non li hanno mai incontrati nella pratica. AFAIK tutti gli archivi correnti rappresentano directory come percorsi separati da barre. Ciò non rovina l'esempio, tuttavia, tali archivi possono davvero modellare il filesystem. –

Problemi correlati