Java - FilenameFilter和FileFilter的区别

 FilenameFilter和FileFilter接口都是用于文件的筛选。但是方法的参数有所不同:

 FilenameFilter 接口:boolean accept(File dir,String name); 其中dir为当前目录,name是文件名。

 FileFilter接口:boolean accept(File pathname);pathname则为文件

 

到此我们只能看出他们参数的不一致。为了进一步了解,我们看一下他们执行时的情况。

通常我们会用下面三个函数进行使用文件过滤器。

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();

        }));
    }

}

运行结果

a.txt
advanced
alg
exp
jedis-master
pythonCode
source
spark-2.3.1-rc4
E:\intellij\pythonCode
E:\intellij\pythonCode
E:\intellij\pythonCode

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图片浏览器 (后面附有完整代码) 一、需求分析 1、首先。因为要显示图片所以要先有一个界面;用JFrame; 2、因为要能显示选定文件夹内的图片,所以要有一个文件夹选择器;用JTree; 3、显示图片的滚动面板;用JScrollPane; 4、因为要对图片进行分类,所以要设计分类模块; 5、因为要对图片进行备份,所以要设计备份模块; 6、因为要对图片进行幻灯播放,所以要设计幻灯播放模块; 二、概要设计 本次课程设计模块图、系统流程图: 三、运行环境、开发语言 操作系统:Windows XP 专业版 32位 SP3 ( DirectX 9.0c ) 开发工具:MyEclipse 开发语言:java 四、详细设计 1 程序清单 String pt;鼠标点击的图片的绝对路径 File[] files2;面板上正在显示的图片文件 JLabel[] imageLabel;图片绑定的JLabel控件组 JLabel jlabel,jimageLabel; 图片绑定的JLabel控件 JPanel jp1,jp2,jp3;显示不同内容的面板 JButton[] jb;按钮数组 private JTree tree;文件夹选择树 private JScrollPane jsp1,jsp2,jsp3;滚动面板 Timer timer;计时器 public PictureDir()类的构造函数 WindowAction窗体事件 TreeSelect文件夹选择树事件 FileDidianListener分类为地点事件 FileRenwuListener分类为人物事件 FileXiangceListener分类为相册事件 FileQitaListener分类为其它事件 FileZipListener备份事件 FileBackListener还原事件 MouseAction鼠标点击事件 FileStartListener幻灯片播放事件 JCAction显示分类图片事件 read(String)读文件函数 save(String,String)写文件函数 unzip(String,String)解压缩函数 resizeIcon(ImageIcon,JLabel)控制图片显示大小的函数 deleteFile(File)删除文件函数 main(String[])主函数 2 主要代码 整个程序的界面如下图: 2.1 选择文件夹功能 class TreeSelect implements TreeSelectionListener{ public void valueChanged(TreeSelectionEvent e) { TreePath path=e.getPath(); DefaultMutableTreeNode node=(DefaultMutableTreeNode)path.getLastPathComponent(); Object userObject=node.getUserObject(); if(!(userObject instanceof File)){ return; } File folder=(File)userObject; if(!folder.isDirectory()) return; File[] files1=initImageSets1(folder); for(File file:files1){ node.add(new DefaultMutableTreeNode(file)); } files2=initImageSets2(folder); for(int i=0;i<imageLabel.length;i++){ imageLabel[i].setIcon(null); imageLabel[i].setBorder(null); } for(int i=0;i<files2.length;i++){ imageLabel[i].setIcon(new ImageIcon(files2[i].toString())); imageLabel[i].addMouseListener(new MouseAction()); imageLabel[i].setName(String.valueOf(i)); resizeIcon(new ImageIcon(files2[i].toString()),imageLabel[i]); } } private File[] initImageSets1(File pictureDir){ return pictureDir.listFiles(new FilenameFilter(){ public boolean accept(File dir,Strin

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值