功能介绍
最近工作中遇到一个需求,需要扫描某个路径下的所有文件,并且得根据预先设置的文件格式来过滤。于是就用java的递归实现了一个简单的工具类,分享在本文,欢迎大家使用。
代码说明
代码一共两个函数,第一个函数scanFile
是入口函数,需要使用的时候就调用这个函数。里面的主要代码就是检查提供的文件路径是否是一个合法的路径,是否是一个目录。
第二个函数scanFileWorker
是递归函数,就是通过递归来循环检查某个文件夹下的所有文件,如果是文件,则加入返回结构List,如果是文件夹则进入下一次递归。
代码如下:
package com.coderbbb.utils;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author longge93
*/
public class FolderFileScanUtil {
public static List<String> scanFile(String path, String[] exts) {
File file = new File(path);
if (!file.exists()) {
throw new RuntimeException("路径不存在");
}
if (!file.isDirectory()) {
throw new RuntimeException("不是文件夹路径");
}
List<String> result = scanFileWorker(path);
result = result.stream().filter(item -> {
int index = item.lastIndexOf(".");
String ext = item.substring(index + 1);
return Arrays.asList(exts).contains(ext);
}).collect(Collectors.toList());
return result;
}
private static List<String> scanFileWorker(String path) {
List<String> result = new ArrayList<>();
File file = new File(path);
File[] files = file.listFiles();
if (files == null || files.length == 0) {
return result;
}
for (File f : files) {
if (f.isFile()) {
result.add(f.getAbsolutePath());
} else {
result.addAll(scanFileWorker(f.getAbsolutePath()));
}
}
return result;
}
public static void main(String[] args) {
String[] exts = {
"mp4"
};
List<String> data = FolderFileScanUtil.scanFile("D:\\文档\\test-data", exts);
System.out.println(data);
}
}
说明一下scanFile
函数的入参:
path
是需要扫描的路径。exts
是一个String数组,代表文件后缀名,不在这个数组内的文件将被忽略。
性能优化
我们上面的代码中,扫描一直是单线程进行的。当遇到特别繁杂的路径需要扫描的时候,性能应该还可以通过多线程的手段提升。但是考虑到本身磁盘IO的性能瓶颈,最终性能是受制于单线程还是磁盘IO的极限,还需要再测试一下。后续有结果将更新在本文。