Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between Files.list and Files.walkFileTree and Files.walk with maxdepth = 1?

If I want to do something with files only on the first level of the directory, is there a difference between using Files.list(...) or Files.walkFileTree(...) or Files.walk(...)?

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;
    }
});

versus

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

versus

Files.walk(directory, 1)
    .forEach(path -> {
        try {
            doSomething(path);
        } catch (IOException exc) {
            // log exc
        }
});
like image 684
andrybak Avatar asked Jun 16 '16 11:06

andrybak


People also ask

What is walkFileTree?

The walkFileTree method from the NIO Files class is a static method that we used to walk a file tree. The walking starts at a given Path. It can either be a file or a directory. The traversal starts at that node and it recursively visits each node in the tree in a depth-first fashion.

What does the files list () method in Java do?

list() returns the array of files and directories in the directory defined by this abstract path name. The method returns null, if the abstract pathname does not denote a directory.

What is a regular file in Java?

A regular file is a sequence of bytes stored permanently in a file system.

Which of the following statements is true regarding the file visitor interface?

Answer and Explanation: 1. The only true statement is C), All methods defined in an interface must be implemented when used by another class.

What is the use of file walk in Python?

Files.walk returns a stream that is lazily populated with Path by recursively walking the file tree rooted at a given starting file. The file tree is traversed depth-first.

What is the difference between walk and walkfiletree?

The difference between walk and walkFileTree is that they supply different interfaces for walking the tree: walkFileTree takes FileVisitor, walk gives Stream<Path>.

How do I Walk a file in Java?

Java Files.walk tutorial shows how to walk files in Java with Files.walk . Files.walk returns a stream that is lazily populated with Path by recursively walking the file tree rooted at a given starting file. The file tree is traversed depth-first.

How to walk a file tree using NIO files?

The walkFileTree method from the NIO Files class is a static method that we used to walk a file tree. The walking starts at a given Path. It can either be a file or a directory. The traversal starts at that node and it recursively visits each node in the tree in a depth-first fashion.


2 Answers

Using following code as test, I got the hang of the issue. The main difference between walk* and list is that list(dir) gives a stream of files in the directory dir, while both walk* method walk the subtree of its argument including the root of subtree—the directory itself.

The difference between walk and walkFileTree is that they supply different interfaces for walking the tree: walkFileTree takes FileVisitor, walk gives 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);
    }
}
like image 81
andrybak Avatar answered Oct 30 '22 12:10

andrybak


All these 3 solutions look correct, but it's better to use the simplest and the most readable way, so Files.list() looks natural to solve this problem.

like image 41
Vladimir Vagaytsev Avatar answered Oct 30 '22 12:10

Vladimir Vagaytsev