[原创]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;
}
}

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

  调用也很简单:

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

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

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

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

File a = new File(path);

boolean b = a.renameTo(a);

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

上一篇:机器学习中的范数规则化之(一)L0、L1与L2范数 非常好,必看


下一篇:HFile解析 基于0.96