IO操作filename与filefilter、List 和 listFiles()的区分

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();
        }));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值