如何在 Java 7 中用 nio 替换 File.listFiles(FileFilter filter)?

Posted

技术标签:

【中文标题】如何在 Java 7 中用 nio 替换 File.listFiles(FileFilter filter)?【英文标题】:How to replace File.listFiles(FileFilter filter) with nio in Java 7? 【发布时间】:2013-01-31 08:09:13 【问题描述】:

我有一些用 Java 6 编写的文件 I/0 遍历代码,试图将其移动到 Java 7 中的新 I/O,但我找不到此类东西的替代品。

File[] files = dir.listFiles(AudioFileFilter.getInstance());

也就是说,没有办法只过滤文​​件的路径,它返回文件列表,所以如果我想限制在它调用的方法中使用 File,我必须将每个文件转换为路径 (file.toPath),这似乎比较费力。

我确实看过 FileVisitor,但这似乎不允许你控制树的遍历方式,所以我认为它对我有用。

那么 Java 7 中的 Path for File 有多少替代品?

【问题讨论】:

【参考方案1】:

使用Files#newDirectoryStream 和DirectoryStream.Filter

代码如下:

DirectoryStream<Path> stream = Files.newDirectoryStream(dir, new DirectoryStream.Filter<Path>() 

        @Override
        public boolean accept(Path entry) throws IOException 
        
            return Files.isDirectory(entry);
        
    );

for (Path entry: stream) 
      ...

顺便说一句,为简单起见,我省略了上述代码中的异常处理。

【讨论】:

虽然如果你想将文件列表传递给另一个方法(我这样做文件是在不同的线程上处理的)有点混乱,你遍历文件并将它们添加到列表中 您可以简单地将流传递给另一个方法,而不是传递一个列表。当然,取决于您是否控制所述方法的参数类型。如果不是,那么您是绝对正确的,迭代一个列表结构只是为了将内容添加到另一个列表结构中没有多大意义。 我对新的nio包不熟悉,但是我看到一个流,它无处关闭! FilenameFilter 怎么样?这里好像少了。

以上是关于如何在 Java 7 中用 nio 替换 File.listFiles(FileFilter filter)?的主要内容,如果未能解决你的问题,请参考以下文章

安卓导入java.nio.file.Files;无法解决

如何在 Java 7 中可移植地获取文件存储的块大小?

如何在android中使用java.nio.file包? [复制]

Java:如何使用 java.nio.file.FileSystem 在 zip 中创建目录

如何在Java中用空字符串替换'

Java 7 NIO watchservice vs jpathwatch