【java查漏补缺】File类的使用

文章介绍了Java的File类如何处理文件数据,特别是使用list()方法获取文件名以及通过FilenameFilter进行文件名过滤。当传入FilenameFilter参数时,list()方法会调用过滤器的accept()方法进行过滤。此外,示例展示了如何自定义过滤器并按特定条件排序文件名列表。
摘要由CSDN通过智能技术生成

File类可以用来处理文件数据,比如使用list()方法可以获得某个文件夹下面的所有文件名。

File类的list()方法有一个含有一个参数的重载,在调用该方法的时候需要传入一个FilenameFilter对象,这样便可以进行文件名过滤。

我们先来看一下list()函数的源码

// 没有参数的list()函数
public String[] list() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(path);
    }
    if (isInvalid()) {
        return null;
    }
    return fs.list(this);
}


// 有参数的list()函数
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参数的时候,首先会调用无参的list()函数,获取目录下所有文件名,然后判断一下获取的文件名数组和过滤器对象是否为空,如果两个都为空,那么无参的list()函数得到的结果,否则就回调过滤器的accept()函数进行过滤,符合条件的文件名就存到List<String>容器中,最后将容器中的数据打包成String数组返回。

我们可以继续深入去看FilenameFileter对象,会发现实际上就是一个函数式接口,其源码如下

@FunctionalInterface
public interface FilenameFilter {
    /**
     * Tests if a specified file should be included in a file list.
     *
     * @param   dir    the directory in which the file was found.
     * @param   name   the name of the file.
     * @return  <code>true</code> if and only if the name should be
     * included in the file list; <code>false</code> otherwise.
     */
    boolean accept(File dir, String name);
}

我们只需要实现accept()方法就行了,在进行文件名过滤的时候会回调accept()方法。

使用上述的api,可以实现对系统文件的一些操作。

  • 文件名过滤器

文件名过滤器主要的功能就是根据输入的参数对某个文件下下的所有文件名进行过滤。

import java.io.File;
import java.io.FilenameFilter;

public class DirList {
    public static void main(String[] args) {
        File path = new File("..");
        String[] list;
        // 如果没有传入额外参数的话就直接获取所有文件
        if(args.length == 0) {
            list = path.list();
        }
        else {
            list = path.list(new DirFileter(args[0]));
        }
        // 将读取的文件逐个打印
        for(int i=0; i<list.length; i++){
            System.out.println(list[i]);
        }
    }
}

class DirFileter implements FilenameFilter{

    String afn;

    DirFileter(String afn){
        this.afn = afn;
    }

    @Override
    public boolean accept(File dir, String name) {
        // 读取文件名,然后判断是否包含指定字符
        String f = new File(name).getName();
        return f.contains(afn);
    }
}

当我们不传入任何参数的时候,就会列出相应目录的所有文件

 我们还可以传入一个参数对文件名进行过滤

 

 

  • 排序目录列表

有的时候,我们需要对文件名按照一定的顺序进行排列输出,这时候就可以将上面的代码进行一定修改

import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;

public class SortedDirList {
    private File path;
    private String[] list;
    public SortedDirList(final String afn){
        path = new File("..");
        if(afn == null){
            list = path.list();
        }
        else {
            list = path.list(new FilenameFilter() {
                @Override
                public boolean accept(File dir, String name) {
                    String f = new File(name).getName();
                    return f.contains(afn);
                }
            });
        }
        sort();
    }

    // 打印
    public void print(){
        if(list != null) {
            for (int i = 0; i < list.length; i++) {
                System.out.println(list[i]);
            }
        }
    }

    private void sort(){
        Arrays.sort(list);
    }

    public static void main(String[] args) {
        SortedDirList sd;
        if(args.length == 0){
            sd = new SortedDirList(null);
        }
        else {
            sd = new SortedDirList(args[0]);
        }
        sd.print();
    }

}

上述代码在逻辑上就是在进行文件名过滤后,再添加排序的逻辑,其中排序逻辑都在sort()函数中编写,使用Arrays.sort(list)进行排序的逻辑是,先排大写字母,后排小写字母,并且按照字典顺序排序,程序运行逻辑如下所示

通过在sort()函数中编写不同的逻辑就可以实现不同的排序需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值