前言:有时候我们可能会遇到这样一个问题:需要遍历一个包含极多文件的文件夹,首先想到的肯定是使用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可以判断是否在占用