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*
都提供方法 遍历子树 它的参数包括子树的根——目录本身。
walk
和walkFileTree
的区别在于它们提供了不同的接口来遍历树:walkFileTree
接受FileVisitor
,walk
给出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);
【讨论】:
【参考方案2】:这3个解决方案看起来都正确,但最好使用最简单和最易读的方式,所以Files.list()
看起来很自然地解决了这个问题。
【讨论】:
【参考方案3】:Files.list
简单地委托给Files.newDirectoryStream
并将底层java.nio.file.DirectoryStream
公开为java.util.stream.Stream
,因此它们的功能基本相同,只是Files.newDirectoryStream
允许您传递可选的DirectoryStream.Filter
。
Files.walkFileTree
还公开了BasicFileAttributes
(例如lastModifiedTime
、isRegularFile
和size
)。如果您需要这些属性,从Files.walkFileTree
获取它们可能更方便(并且可能更有效),而不是单独查找它们。
【讨论】:
以上是关于Files.list 和 Files.walkFileTree 以及 maxdepth = 1 的 Files.walk 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
dpkg: warning: files list file for package `*****' missing, assuming package has no files curren