-
Notifications
You must be signed in to change notification settings - Fork 0
Java traverse files
raisercostin edited this page Sep 19, 2018
·
4 revisions
- java.io.File.listFiles - old java IO
- java.nio.Files.newDirectoryStream - NIO & NIO2 - new java IO
- org.apache.commons.io.FileUtils.iterateFiles org.apache.commons.io.FileUtils.iterateFilesAndDirs (commons-io:2.6) - uses jdk7 but File.listFiles
- com.google.common.io.Files.fileTreeTraverser (guava:26.0) uses jdk7 but File.listFiles
- java.nio.Files.walk - uses newDirectoryStream and returns a Stream
- java.nio.Files.walkFileTree - uses newDirectoryStream by using a java.nio.file.FileVisitor
- See how a Finder is implemented at https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/essential/io/examples/Find.java
- https://docs.oracle.com/javase/tutorial/essential/io/walk.html
- manually iterate using Files.newDirectoryStream - https://examples.javacodegeeks.com/core-java/nio/java-nio-iterate-files-directory/
- parallel iterate using Files.walkFileTree - https://stackoverflow.com/questions/17732819/parallel-version-of-files-walkfiletree-java-or-scala
- File.listFiles is also an option but is using old java IO library.
- walkFileTree example - https://www.concretepage.com/java/jdk7/traverse-directory-structure-using-files-walkfiletree-java-nio2
- com.google.common.io.Files.fileTreeTraverser is uses File.listFiles but also com.google.common.collect.TreeTraverser that is a generic way to traverse a tree.
Comparison of how to traverse files in jdk7 using Files.walk, Files.walkFileTree and Files.newDirectoryStream. All of them call Files.newDirectoryStream which is implemented natively by JVM. This lists all entries in a directory.
sequenceDiagram
Client->>+Files:walk => Stream<Path>
Files->>FileTreeIterator: create
FileTreeIterator->>FileTreeWalker: create
Note right of DirectoryStream: lists only a directory
FileTreeWalker->>DirectoryStream:create
Files->>FileTreeIterator: iterate
FileTreeIterator->>FileTreeWalker: walk => Event
FileTreeWalker->>DirectoryStream:create | walk | next
Client->>Files:newDirectoryStream
Files->>DirectoryStream: create
Note right of DirectoryStream:stream inside a directory
Client->>Files:walkFileTree(visitor:FileVisitor<Path>)
Files->>FileTreeWalker:create
Files->>Files:iterate
Files->>FileTreeWalker:walk => Event
FileTreeWalker->>DirectoryStream:create | walk | next