以更快的方式查找具有子目录的目录中的文件列表

时间:2016-08-31 04:11:27

标签: java performance file

有一个文件列表(数量为27000)。目标是在目录结构(具有多级子目录)中搜索这些文件中的每一个并打印丢失的文件。我有使用递归函数的代码来搜索文件的存在。代码似乎是有效的,但是当要搜索的文件数量非常高时,对于这种特定情况来说速度非常慢。无论如何都有提高此代码的性能。

代码段如下:

public static boolean walk(String path, String fileName) throws Exception {

    File root = new File(path);
    File[] list = root.listFiles();

    if (list == null)
        return false;

    for (File f : list) {
        if (f.isDirectory()) {
            walk(f.getAbsolutePath(), fileName);
        } else {
            if (f.getAbsoluteFile().getName().equalsIgnoreCase(fileName)) {
                presentFiles.add(f.getAbsoluteFile().getName());
                throw new Exception("hi");
            }
        }
    }
    return false;
}



public static void main(String[] args) {

    int i = 0;

    for (String fileName : attrSet) {//attrSet is HashSet of all the files which are being searched.
        try{
        boolean isFileFound = walk(source, fileName);
        }
        catch(Exception e) {
            System.out.println(e.getMessage() + i++);
        }
    }

    attrSet.removeAll(presentFiles); //presentFiles is HashSet of all files present in the directory

    for (String fileNm : attrSet) {
        System.out.println("FileName : " + fileNm);
    }

}

1 个答案:

答案 0 :(得分:1)

正如评论中已经提到的那样,转过程:

  1. 将列表中的文件名放入哈希集
  2. 以递归方式遍历目录结构,同时从哈希集中删除所有找到的文件
  3. 哈希集现在只包含丢失的文件。
  4. 现在测试一个文件所需的时间大致相同(如果我们不考虑磁盘缓存)。因此,加速几乎是27000的因素。