[原创]Java中使用File类的list方法获取一定数量的文件:FilenameFilter接口的特殊用法

前言:有时候我们可能会遇到这样一个问题:需要遍历一个包含极多文件的文件夹,首先想到的肯定是使用File.list()方法,该方法返回一个String[],但是如果文件达到几亿呢?这个时候我们就需要分批获取文件夹中的文件了

解决方法:分批获取文件,每次获取一定数量

  而File类中没有直接筛选数量的方法和参数,但是有list(FilenameFilter)方法,FilenameFilter一般是用来过滤返回文件列表的文件类型的,这里我们借助他来实现返回一定数量文件的功能。

  首先创建一个类,实现FilenameFilter接口:

package test;

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

/**
 * 文件数量过滤类
 * @author Guangshan
 */
public class FileNumFilter implements FilenameFilter {
    
    private int maxFileNum;
    private int fileCount; //记录文件数
    
    public  FileNumFilter(int maxFileNum) {
        this.maxFileNum = maxFileNum;
    }
    
    @Override
    public boolean accept(File dir, String name) {
        if(fileCount >= maxFileNum)
            return false;
        else
            fileCount++;
        return true;
    }
}
View Code

  代码很简单,就是使用类成员变量来记录数量变化,每收到一个文件数量加一,直到达到规定的数量,则不再接受文件。

  调用也很简单:

package test;

import java.io.File;

public class Test {
    public static void main(String[] args) {
        File test = new File("D:\test");
        String[] fileList = test.list(new FileNumFilter(10));
    }
}
View Code

  这样获取的String[]的size就是10了。

PS:当使用while(true)进行死循环时,一定要使用sleep(1),哪怕只有1ms,对CPU的占用也会极大的减少。

PPS:小技巧,判断一个文件正在使用(包括被其他程序使用,被作为InputStream打开等等情况),可以使用:

File a = new File(path);

boolean b = a.renameTo(a);

根据b可以判断是否在占用