1、Filename 与filefilter 区别
** FilenameFilter和FileFilter接口都是用于文件的筛选。但是方法的参数有所不同:**
FilenameFilter 接口:boolean accept(File dir,String name); 其中dir为当前目录,name是文件名。
其中第一个参数File dir为需要过滤文件所在目录,第二个参数为对应的文件名。该方法返回一个布尔类型,
当返回false时,该文件会被过拦截,我们不会接收到这个文件。
当返回true时,该文件会通过该过滤器被我们所接收使用。
例子:
/**
*使用FilenameFilter过滤格式为txt的文件
*/
import java.io.File;
import java.io.FilenameFilter;
public class FileNameFilterUtil {
public static void main(String[] args) {
File file=new File("G:\\test\\images");
//调用myFilter用于过滤文件
File[] files=file.listFiles(new myFilter (".txt"));
for (File file2 : files) {
System.out.println(file2);
}
}
}
class myFilter implements FilenameFilter{
//定义用于接收过滤条件“.txt”的字符串
private String fin;
public myFilter (String fin) {
super();
this.fin=fin;
}
@Override
public boolean accept(File dir, String name) {
//主要代码,过滤相应的文件,返回一个布尔类型
return name.endsWith(fin);
}
}
FileFilter接口:boolean accept(File pathname);pathname则为文件
FileFilter和FilenameFilter的用法相似,也是只有accept方法。不同的是FileFilter中的accept方法只带一个参数 ,File pathname为需要过滤的文件所在位置。
例子:
核心代码:
public static class myFilter implements FileFilter {
private String fin;
public myFilter(String fin) {
this.fin=fin;
}
public boolean accept(File dir) {
//获取文件名
String name = dir.getName();
//进行过滤
return name.endsWith(fin);
}
}
(总结:FileFilter与它的前身FilenameFilter唯一不同的是,FileFilter提供文件对象的访问方法。而FilenameFilter是按照目录和文件名的方式来工作的。)
2、List 和 listFiles() 区别
(1)返回值类型不同:前者为String数组,后者为File对象数组
(2)数组中元素内容不同:前者为string类型的【文件名】(包含后缀名),后者为File对象类型的【完整路径】
因此,遍历文件夹中所有文件,包括子文件夹中的文件时,必须用listFiles()方法
例子:
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
public static void main(String[] args) {
File file = new File("F://");
//listFiles返回的File数组
File[] str = file.listFiles();
//list返回的只是目录或文件的字符串,不能进行其他操作(isFile,isDirectory之类的)
// String[] str = file.list();
//遍历获得的目录或文件的File数组
for(File s : str){
if(s.isFile()){
System.out.println("文件:"+s.getName());
}
if(s.isDirectory()){
System.out.println("目录:"+s.getName());
}
}
}
3、比较list(FilenameFilter filter)、listFiles(FilenameFilter filter)和listFiles(FileFilter filter)
public String[] list(FilenameFilter filter); // 返回的是符合要求的文件名称,以字符串数组返回
public File[] listFiles(FilenameFilter filter); // 返回的是符合要求的文件,以文件类型返回
public File[] listFiles(FileFilter filter); // 返回的是符合要求的文件,以文件类型返回
其中,list方法由于返回字符串形式,所以,只支持FilenameFilter参数。当我们只需要文件名,并不需要对文件进行操作时,选择list方法简单高效。
重点比较listFiles(FilenameFilter filter)和listFiles(FileFilter filter)。从返回结果和功能上,它们并没有什么区别,都是选取符合某种条件的File类型数据。
具体回调过程:
/** 返回当前目录下 符合文件过滤器 filter.accept(File dir,String name)的文件名称 */
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
List<String> v = new ArrayList<>();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return v.toArray(new String[v.size()]);
}
/** 返回当前目录下 符合文件过滤器 filter.accept(File dir,String name)的文件数组 */
public File[] listFiles(FilenameFilter filter) {
String ss[] = list();
if (ss == null) return null;
ArrayList<File> files = new ArrayList<>();
for (String s : ss)
if ((filter == null) || filter.accept(this, s))
files.add(new File(s, this)); // 字符串匹配成功了,再新建file
return files.toArray(new File[files.size()]);
}
/** 返回当前目录下 符合文件过滤器 FileFilter filter.accept(File name)的文件数组 */
public File[] listFiles(FileFilter filter) {
String ss[] = list();
if (ss == null) return null;
ArrayList<File> files = new ArrayList<>();
for (String s : ss) {
File f = new File(s, this); // 每次都要新建一个文件,按照文件来匹配
if ((filter == null) || filter.accept(f))
files.add(f);
}
return files.toArray(new File[files.size()]);
}
最大的不同就是,listFiles(FilenameFilter filter)是先用字符串匹配,匹配成功后创建File对象。而listFiles(FileFilter filter),则不同,直接先创建File对象,后使用File对象进行匹配。
所以,不对文件进行操作,只筛选的话从效率上说,listFiles(FilenameFilter filter)是更快的。如果需要对文件进行操作,则listFiles(FileFilter filter)更加方便。
例子:
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.regex.Pattern;
public class FileExp {
public static void printf(Object[] obj){
for(Object o : obj){
System.out.println(o.toString());
}
}
public static void main(String[] args){
File path = new File("E:\\intellij");
printf(path.list());
printf(path.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
Pattern pattern = Pattern.compile("pythonCode");
return pattern.matcher(name).matches();
}
}));
printf(path.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname) {
Pattern pattern = Pattern.compile("pythonCode");
return pattern.matcher(pathname.getName()).matches();
}
}));
printf(path.listFiles((dir,name)->{
Pattern pattern = Pattern.compile("pythonCode");
return pattern.matcher(name).matches();
}));
}
}