快速列出目录及其所有子目录中的文件

3

我需要在一个目录及其所有子目录中查找所有文件(除了某些文件)。
目前我正在使用以下方法:

public  static Collection<File> listFiles(File directory,FilenameFilter filter,boolean recurse){
    Vector<File> files = new Vector<File>();
    File[] entries = directory.listFiles();
    if(entries!=null){
        for (File entry : entries){
            if (filter == null || filter.accept(directory, entry.getName())){
                    files.add(entry);
            }

            if (recurse && entry.isDirectory()){
                    files.addAll(listFiles(entry, filter, recurse));
            }
        }
    }
    return files;
}

并且像这样使用它:
        this.foundFiles=listFiles(new File(this.BaseDirectory), new FilenameFilter() {
            public boolean accept(File dir, String name) {
                boolean res=true;
                if(name.endsWith(".pdf")){
                    if(!dir.getPath().endsWith("done")){
                        if((workingFile!=null && (dir.getPath().equals(workingFile.getParent()) && name.equals(workingFile.getName())))){
                            res=false;
                        }else{
                            try {
                                ArrayList<String> AuthFolders = DB.getGroupAuthFoldersArray();
                                for(String folder:AuthFolders){
                                    if(dir.getPath().startsWith(BaseDirectory+File.separator+folder)){
                                        res=true;
                                        break;
                                    }else{
                                        res=false;
                                    }
                                }
                            } catch (SQLException ex) {
                                Logger.getLogger(scanner.class.getName()).log(Level.SEVERE, null, ex);
                                res=false;
                            } catch (InterruptedException ex) {
                                Logger.getLogger(scanner.class.getName()).log(Level.SEVERE, null, ex);
                                res=false;
                            }
                        }
                    }else{
                        res=false;
                    }
                }else{
                    res=false;
                }
                return res;
            }
        }, true);

但这个方法太慢了!我有大约3000个文件在目录中,使用这种方法需要10-15分钟才能找到它们。

怎么才能更快呢?
我考虑使用org.apache.commons.io.FileUtils.listfiles方法。有没有更快的方法?

谢谢。


你尝试过使用org.apache.commons.io.FileUtils.listfiles吗?也许它的速度正好满足你的需求。顺便问一下:你是在为每个找到的PDF文件查询数据库吗?我认为这会成为性能杀手。 - flash
10-15分钟?怎么这么久?Profiler(或-Xprof JVM标志)是你最好的朋友。无论如何,我会试一试Apache Commons的listfile()方法,它在全世界广泛使用。 - Petr Janeček
1
为什么你没有将过滤器传递给listFiles方法?http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles(java.io.FilenameFilter) - kofemann
1
清单不是问题。你的问题在于每个文件的数据库查找。 - kofemann
} catch (SQLException ex) {这行代码是用于捕获数据库操作中可能抛出的SQLException异常。针对一个旨在执行“目录列表”操作的类中,这个异常处理可能是不必要的,因为该类没有涉及到与数据库相关的操作。 如需更快的帮助,请发布一个SSCCE(http://sscce.org/)。 - Andrew Thompson
显示剩余4条评论
2个回答

9

在IT技术方面,推荐使用Java 7中的Files.walkFileTree代替listFiles,因为它使用了流处理,速度更快。欲了解更多信息,请参阅教程


1
} catch (SQLException ex) { 

这不属于一个旨在执行目录列表的类别!


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