Java 递归文件列表检查正在返回重复项
我创建了一个方法,它遍历并查找给定目录中的每个文件,然后检查它是否满足FileFilter的要求,并返回数组列表中的所有文件Java 递归文件列表检查正在返回重复项,java,file,recursion,duplicates,duplicate-removal,Java,File,Recursion,Duplicates,Duplicate Removal,我创建了一个方法,它遍历并查找给定目录中的每个文件,然后检查它是否满足FileFilter的要求,并返回数组列表中的所有文件 public static ArrayList<File> listFiles(File dir, FileFilter filter) { ArrayList<File> files = new ArrayList<File>(); if (filter == null) files = listFil
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;
}
最后四个文件是前四个文件的副本。它的失败也是意料之中的,只有前4行文件被添加了两次(因此,如果在目录结束之前一行中只有2个文件,那么只有2个文件会被复制)
directoryFilter是结果中没有实际的.txt文件的原因。您的代码适合我(在修复了错误并进行了一些清理之后)
import java.io.*;
导入java.util.*;
公共类文件树{
公共静态void main(字符串[]args){
System.err.println(listFiles(新文件(args[0]),新文件筛选器(){
@重写公共布尔接受(文件路径名){
返回true;
}
}));
}
公共静态ArrayList列表文件(文件目录、文件过滤器){
ArrayList files=新的ArrayList();
列表文件(目录、文件、过滤器);
归还文件;
}
私有静态无效列表文件(文件目录、ArrayList文件、文件过滤器){
如果(!dir.isDirectory()){
返回;
}
对于(文件:dir.listFiles()){
if(filter.accept(文件)){
文件。添加(文件);
}
列表文件(文件、文件、过滤器);
}
}
}
请添加listFiles方法,该方法将3个参数添加到您的帖子中。好的,我添加了可能有用的代码块。您粘贴的内容有错误。方法签名与您的调用不匹配,而且看起来您已经把事情复杂化了。清理您的代码并在这里发布工作示例,否则您将得不到任何帮助…我在粘贴到这里的内容中发现的唯一错误是参数不匹配,所有内容都是导入和名称更改…您能解释一下吗?我想我忽略了差异,以及为什么这种差异对你有效…这几乎是你的代码。。。我将3 arglistFiles
方法更改为返回void
,因为文件列表已作为参数传递。结束递归的'dir.exists'检查似乎是多余的——如果它是一个目录,那么它也必须存在。我添加了大括号,以便更清楚地了解if
语句中的块是什么。我添加了import
语句和一个main方法,以便运行代码。我添加了一个接受所有文件的过滤器,因为您的代码无法处理null
过滤器。你对代码有什么具体的问题吗?是的,当我把你的代码复制粘贴到我的IDE中时,它工作了,但当我对代码进行更改时,它没有。。。我会再胡闹一点,看看我能不能找到原因,如果不能,我会更新OP。。。顺便说一句,在你改变我的代码之前,你有和我一样的问题吗?哦,没关系,哈哈。。。我遇到的问题来自另一个写得不正确的方法,我在上面的方法之后直接调用了这个方法。。。现在我觉得有点傻。看起来OP中的代码工作得很好。。。但是无论如何,请把你的答案标记为正确谢谢你的帮助。@TotallyRandomGuy这就是人们要求
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
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);
}
}
}