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

17

我有一些用Java 6编写的文件I / O遍历代码,尝试将其移植到Java 7的New I / O中,但我找不到任何替代这种东西的方法。

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

换句话说,没有办法只过滤路径而不是文件,并且它返回文件列表,因此如果我想限制它调用的方法中使用File的情况,那么我就必须将每个文件转换为路径(file.toPath),这似乎相当费力。

我确实看了一下FileVisitor,但是它似乎不能控制如何遍历树,所以我认为这对我不起作用。

那么在Java 7中,Path对File来说有多大的替代作用?

1个回答

25

使用Files#newDirectoryStreamDirectoryStream.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) {
      ...
}

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


虽然如果你想将文件列表传递给另一个方法(我这样做是因为文件在不同的线程上处理),有点混乱,你需要遍历文件并将它们添加到列表中。 - Paul Taylor
不必传递列表,你可以直接将流传递给另一个方法。当然,这取决于你是否控制所述方法的参数类型。如果不是,你绝对是正确的,迭代一个列表结构只为将内容添加到另一个列表结构中并没有太多意义。 - Silwing
我不熟悉新的nio包,但我看到一个流,它没有关闭! - Alexis Leclerc
文件名过滤器呢?好像这里没有。 - Stephan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接