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可以判断是否在占用

你可能感兴趣的:(FilenameFilter)