zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java基础---->FilenameFilter之文件过滤

JAVA文件基础 gt 过滤 ----&
2023-09-27 14:20:11 时间

FilenameFilter用于对列表中文件名的过滤,今天我们就开始java中FilenameFilter的学习。好多年了,你一直在我的伤口中幽居,我放下过天地,却从未放下过你,我生命中的千山万水,任你一一告别。


java中FilenameFilter的使用

java文档对FilenameFilter的描述:

Instances of classes that implement this interface are used to filter filenames. These instances are used to filter directory listings in the list method of class File, and by the Abstract Window Toolkit's file dialog component.

我们通过一个案例,来加深对FilenameFilter的了解与使用,项目结构如下:

img

一、 定义一个实现FilenameFilter的类,用于对文件名的过滤

package com.huhx.file;

import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Pattern;
/**
 * @author huhx
 */
public class DirFilter implements FilenameFilter {
    private Pattern pattern;

    public DirFilter(String regex) {
        pattern = Pattern.compile(regex);
    }

    @Override
    public boolean accept(File dir, String name) {
        return pattern.matcher(name).matches();
    }
}

二、 在DirList.java类中测试使用

package com.huhx.file;

import java.io.File;
import java.util.Arrays;
/**
 * @author huhx
 */
public class DirList {

    public static void main(String[] args) {
        File filePath = new File("file");
        String[] list = filePath.list(new DirFilter("E.*\\.java"));
        Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);

        for (String dirName : list) {
            System.out.println(dirName);
        }
    }
}

三、 得到结果如下:

EscapingDNs.java
External.java

FilenameFilter的分析

一、 我们看一下File类的list(FilenameFilter filter)方法,代码如下:

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

调用list()方法得到文件夹下的所有文件名,然后遍历所有的文件名。通过FilenameFilter的accept方法进行过滤,将符合要求的文件名加入到列表中,最后返回

二、 File中有一个类似的方法listFiles(FileFilter filter)方法,我们看下代码:

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));
    return files.toArray(new File[files.size()]);
}

与上述的list方法很类似,只是返回的类型不一样。