【发布时间】:2014-04-15 16:19:18
【问题描述】:
我一直在努力解决与 FilenameFilter 相关的问题。我想将实现 FilenameFilter 的类的一个对象传递给一个方法,该方法递归地将文件传递到文件夹树中。没有作为参数传递的 FilenameFilter 对象的此方法版本可以正常工作,但重载版本不能。问题是它不会递归地进入文件夹树,尽管它应该。也许一个可能的问题与 accept(File dir, String name); 的参数有关。 方法,有两个参数,我不太确定是否以及如何将值传递给它们......我将非常感谢任何帮助...... 附言。 listfilesRecursive(FilenameFilter filter) 方法适用于具有一个参数和一个字段 path
的类 MyFile 的对象public class MyFile {
String path;
public MyFile (String path) {
this.path = path;
}
List <File> list = new ArrayList<File> ();
List <String> nameList = new ArrayList <String> ();
public List <File> listFilesRecursive(FilenameFilter fFilter) {
File f1 = new File(path);
File [] files = f1.listFiles(fFilter);
for (File fil : files) {
if (fil.isFile()) {
list.add(fil);
nameList.add(fil.getName());
} else if (fil.isDirectory()) {
this.path = fil.toString();
this.listFilesRecursive(fFilter);
}
}
Collections.sort(nameList);
return list;
}
下面是实现 FilenameFilter 的类:
class MyFilenameFilter implements FilenameFilter {
String ext;
public MyFilenameFilter (String ext) {
this.ext = ext;
}
@Override
public boolean accept(File dir, String name) {
// System.out.println(name + " <<<<<<<<<<");
if(name.lastIndexOf('.')>0)
{
int lastIndex = name.lastIndexOf('.');
String str = name.substring(lastIndex);
if(str.equals(ext))
{
return true;
}
}
return false;
}
}
最后,如果我想实现一种方法,通过文件夹选择它们并根据它们的名称过滤它们,FilenameFilter 是一个不错的选择吗?
【问题讨论】:
-
谢谢你,但就我而言,我的工作是专门使用 FilenameFilter 对象实现一个方法,虽然我知道有更简单的方法来完成这项工作,但我必须使用 FilenameFilter 类...不过,您知道出了什么问题吗?
-
我认为你的问题是这一行 this.path = fil.toString();尝试将此作为参数传递,而不是将其作为类成员
-
好吧,但是我不需要这些对象中的任何字段,因此我将能够摆脱任何对象,我认为对吗?如果这个没有 FilenameFilter 参数的方法工作正常而有一个参数的方法没有,你不觉得这很奇怪吗?
-
感谢您的帮助,但我刚刚解决了实际上不是您指出的问题。 :) 该方法根据 fFilter 创建了一个文件数组,这是一个错误的想法,因为如果主文件夹不包含搜索到的文件,则整个数组(基本上由该方法组成)是空的。所以我删除了初始 listFiles() 方法中的一个参数,并在循环的后面进行了比较。 :) 无论如何感谢您的帮助!