2016-06-16 2 views
1

Wenn ich etwas mit Dateien nur auf der ersten Ebene des Verzeichnisses tun möchten, gibt es einen Unterschied zwischen Files.walkFileTree(...) oder Files.walk(...)?Was ist der Unterschied zwischen Files.list und Files.walkFileTree und Files.walk mit maxdepth = 1?

Files.walkFileTree(directory, Collections.emptySet(), 1, new SimpleFileVisitor<Path>() { 
    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
     doSomething(file); 
     return FileVisitResult.CONTINUE; 
    } 

    @Override 
    public FileVisitResult visitFileFailed(Path file, IOException exc) { 
     // log exc 
     return FileVisitResult.CONTINUE; 
    } 
}); 

gegen

Files.list(directory) 
    .forEach(path -> { 
     try { 
      doSomething(path); 
     } catch (IOException exc) { 
      // log exc 
     } 
    }); 

gegen

Files.walk(directory, 1) 
    .forEach(path-> { 
     try { 
      doSomething(path); 
     } catch (IOException exc) { 
      // log exc 
     } 
}); 

Antwort

2

Mit dem folgenden Code als Test, bekam ich den Dreh raus. Der wesentliche Unterschied zwischen walk* und list ist, dass list(dir) einen Strom von Dateien im Verzeichnisdir, während beide walk* Methode gibt den Teilbaum seines Arguments gehen einschließlich die Wurzel des Unterbaums-Verzeichnis selbst.

Der Unterschied zwischen walk und walkFileTree ist, dass sie verschiedene Schnittstellen für das Gehen auf den Baum liefern: walkFileTree nimmt FileVisitor, walk gibt Stream<Path>.

public class FilesTest { 
    public static void main(String[] args) { 
     final String pwd = System.getProperty("user.dir"); 
     System.out.println("Working Directory = " + pwd); 
     Path dir = Paths.get(pwd); 
     System.out.println("Files.walk"); 
     try { 
      Files.walk(dir, 1).forEach(path -> FilesTest.doSomething("walk", path)); 
     } catch (IOException e) { 
      logException("walk", e); 
     } 
     System.out.println("Files.walkFileTree"); 
     try { 
      Files.walkFileTree(dir, Collections.emptySet(), 1, new SimpleFileVisitor<Path>() { 
       @Override 
       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
        doSomething("visitFile", file); 
        return FileVisitResult.CONTINUE; 
       } 

       @Override 
       public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { 
        logException("visitFile", exc); 
        return FileVisitResult.CONTINUE; 
       } 
      }); 
     } catch (IOException e) { 
      logException("walkFileTree", e); 
     } 
     System.out.println("Files.list"); 
     try { 
      Files.list(dir).forEach(path -> FilesTest.doSomething("dir", path)); 
     } catch (IOException e) { 
      logException("dir", e); 
     } 
    } 

    private static void logException(String title, IOException e) { 
     System.err.println(title + "\terror: " + e); 
    } 

    private static void doSomething(String title, Path file) { 
     System.out.println(title + "\t: " + file); 
    } 
} 
1

Alle diese drei Lösungen aussehen richtig, aber es ist besser, die einfachste und am besten lesen, zu nutzen, so Files.list() sieht natürlich, diese zu lösen Problem.

Verwandte Themen