gpt4 book ai didi

java - FileNameFilter 和 FileFilter 的使用

转载 作者:搜寻专家 更新时间:2023-10-31 19:34:53 24 4
gpt4 key购买 nike

我正在编写一个简单的程序,以递归方式列出目录中的文件 .class

最初我这样编码:

public class Parsing{

public static void main(String[] args) {
File f=new File(".\\");
readRecursive(f);
}

private static void readRecursive(File f) {
String[] files=f.list( new FilterByteCode());
if(null==files){
files=new String[0];
}
for(String curr: files){
File currFile=new File(curr);
System.out.println(currFile.getName());
readRecursive(currFile);
}
}
}//end parsing

class FilterByteCode implements FilenameFilter {


@Override
public boolean accept(File dir, String name) {
if(name.endsWith(".class")){
return acceptByteCode(dir);
}else{
return (null!=dir && dir.exists() && dir.isDirectory());
}

}

private boolean acceptByteCode(File dir) {
boolean res= (null!=dir && dir.exists() && dir.isFile());
return res;
}

}//FilterByteCode

但是这里只列出了目录和子目录,没有列出文件!

我使用 FileFilter 解决了:

private static void readRecursiveFile(File f) {
File[] files=f.listFiles(new FilterByteCode2());
if(null==files){
files=new File[0];
}
for(File curr: files){
System.out.println(curr.getName());
readRecursiveFile(curr);
}
}

class FilterByteCode2 implements FileFilter {

@Override
public boolean accept(File pathname) {
if(null!=pathname && pathname.getName().endsWith(".class")){
return acceptByteCode(pathname);
}else{
return (null!=pathname && pathname.exists() && pathname.isDirectory());
}
}//accept

private boolean acceptByteCode(File dir) {
boolean res = (null != dir && dir.exists() && dir.isFile());
return res;
}

}//FilterByteCode2

这项工作列出了文件 .class

我阅读了 FileFilterFilenameFilter 之间的区别,但我没有找到行为差异的原因。

最佳答案

FilenameFilter#accept() 中的 dir 参数表示找到文件的父目录,而不是您所期望的文件本身。因此,在您的 FilenameFilter 方法中,dir.isFile() 将始终返回 false,这使得 acceptByteCode()将始终返回 false

关于java - FileNameFilter 和 FileFilter 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8327131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com