递归文件列表检查返回重复项

时间:2014-12-14 01:31:35

标签: java file recursion duplicates duplicate-removal

我已经使这个方法通过并查找给定目录中的每个文件,然后检查它是否满足FileFilter的要求并返回数组List中的所有文件。

public static ArrayList<File> listFiles(File dir, FileFilter filter) {
    ArrayList<File> files = new ArrayList<File>();
    if (filter == null)
        files = listFiles(dir, files);
    else
        files = listFiles(dir, filter, files);
    return files;
}

private static ArrayList<File> listFiles(File dir, ArrayList<File> files, FileFilter filter) {
    if (!dir.isDirectory() || !dir.exists()) 
        return null;
    for (File file : dir.listFiles()) {
        System.out.println(file);
        if (filter.accept(file))
            files.add(file);
        listFiles(file, filter, files);
    }
    return files;
}

但出于某种原因,它会多次返回一些文件......

(这是对top方法的调用,然后调用底部方法,我没有发布没有fileFilter的版本,因为它以完全相同的方式失败。如果你想知道区别那么只是忽略&#39; if(filter.accept(file))&#39;语句。

ArrayList<File> files = listFiles(new File("Notes"), new DirectoryFilter());

当我通过上述论证时,我得到了回报

Notes/JavaNotes
Notes/JavaNotes/java
Notes/JavaNotes/java/io
Notes/JavaNotes/java/io/File
Notes/JavaNotes/java/io/IOException
Notes/JavaNotes/java/util
Notes/JavaNotes/java/util/ArrayList
Notes/JavaNotes/javax
Notes/JavaNotes/javax/swing
Notes/JavaNotes/javax/swing/JFrame
Notes/JavaNotes
Notes/JavaNotes/java
Notes/JavaNotes/java/io
Notes/JavaNotes/java/io/File

最后四个文件是前四个文件的副本。它也是可预测的失败,只有前4行文件被添加两次(所以如果在该目录到达之前一行中只有2个文件,则只复制2个文件)。

directoryFilter是结果中没有实际.txt文件的原因。

1 个答案:

答案 0 :(得分:2)

您的代码适用于我(在修复错误和清理之后)。

import java.io.*;
import java.util.*;

public class FileTree {
    public static void main(String[] args) {
         System.err.println(listFiles(new File(args[0]), new FileFilter() {   
            @Override public boolean accept(File pathname) { 
                return true;
            }
         }));
    }

    public static ArrayList<File> listFiles(File dir, FileFilter filter) {
         ArrayList<File> files = new ArrayList<File>();
         listFiles(dir, files, filter);
         return files;
    }

    private static void listFiles(File dir, ArrayList<File> files, FileFilter filter) {
        if (!dir.isDirectory()) {
             return;
        }
        for (File file : dir.listFiles()) {
            if (filter.accept(file)) {
                 files.add(file);
            }
            listFiles(file, files, filter);
        }
    }
}