Files.list 和 Files.walkFileTree 以及 maxdepth = 1 的 Files.walk 有啥区别?

Posted

技术标签:

【中文标题】Files.list 和 Files.walkFileTree 以及 maxdepth = 1 的 Files.walk 有啥区别?【英文标题】:What is the difference between Files.list and Files.walkFileTree and Files.walk with maxdepth = 1?Files.list 和 Files.walkFileTree 以及 maxdepth = 1 的 Files.walk 有什么区别? 【发布时间】:2016-10-17 21:43:46 【问题描述】:

如果我只想对目录第一级的文件做一些事情, 使用Files.list(...)Files.walkFileTree(...)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;
    
);

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

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

【问题讨论】:

【参考方案1】:

使用以下代码作为测试,我解决了这个问题。 walk*list 之间的主要区别在于,list(dir) 提供 目录中的文件流 dir,而 walk* 都提供方法 遍历子树 它的参数包括子树的根——目录本身。

walkwalkFileTree 的区别在于它们提供了不同的接口来遍历树:walkFileTree 接受FileVisitorwalk 给出Stream&lt;Path&gt;

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

【讨论】:

【参考方案2】:

这3个解决方案看起来都正确,但最好使用最简单和最易读的方式,所以Files.list()看起来很自然地解决了这个问题。

【讨论】:

【参考方案3】:

Files.list 简单地委托给Files.newDirectoryStream 并将底层java.nio.file.DirectoryStream 公开为java.util.stream.Stream,因此它们的功能基本相同,只是Files.newDirectoryStream 允许您传递可选的DirectoryStream.Filter

Files.walkFileTree 还公开了BasicFileAttributes(例如lastModifiedTimeisRegularFilesize)。如果您需要这些属性,从Files.walkFileTree 获取它们可能更方便(并且可能更有效),而不是单独查找它们。

【讨论】:

以上是关于Files.list 和 Files.walkFileTree 以及 maxdepth = 1 的 Files.walk 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

dpkg: warning: files list file for package `*****' missing, assuming package has no files curren

设置镜像源出现的异常问题,dpkg: warning: files list file for package。。。

php内存溢出问题,求教大神!

python删除指定文件夹及文件夹中的所有文件

python删除指定文件夹及文件夹中的所有文件

python删除指定文件夹及文件夹中的所有文件