关于递归文件目录感觉也是个有点技术含量的活,而且很有意思,
过滤器基本原理如下,最重要的一点是listroots的用法,回头有时间再补充上
文件过滤器
file[] listFiles(FileFilter file)
传递一个FileFilter接口的实现类对象
需要自定义FileFilter接口实现类
class MyFileter implement FileFilter{
public Boolean accept(File pathname){
//判断pathname路径表示的文件名是否相符
return pathname.getName.toLowerCase.endsWith();
}
}
//pathname拿到的就是
1,普通递归,将文件file存入到一个集合之中,返回集合,注意这个list集合要作为一个静态集合,如果放进方法中,每次递归过程中都会被清空
static ArrayList<File> list=new ArrayList<>();
public static ArrayList<File> getFileAll(File file) {
File[] files=file.listFiles();
for (File file2 : files) {
if (file2.isFile()) {
list.add(file2);
}else {
getFileAll(file2);
}
}
return list;
}
2,按照目录格式递归打印文件,这里要注意j+1,不能用j++或者++j,不然打印的结果会很难看,具体原理也不愿去追究
private static void getDirectory(File file,int j) {
for (int i = 0;i<j ; i++) {
System.out.print("\t");
}
if (file.isFile()) {
System.out.println(file.getName());
}
if(file.isDirectory()){
File[] files=file.listFiles();
System.out.println(file.getName()+":/");
for (File file2 : files) {
getDirectory(file2,j+1);
}
}
}
3,递归方式定义过滤器:使用递归方式获取文件的目录和子目录,然后遇到有小于200K的文件,并打印
这里需要注意的是FileFilter的接口重写,过滤掉了隐藏文件,这个也可以定义不去过滤掉
private static void getDir(File file,int j) {
if (!file.exists()) {
System.out.println(file.getName()+"不是文件夹");
return;
}
for (int i = 0; i < j; i++) {
System.out.print("\t");
}
if (file.isFile()) {
if (file.length()<200*1024) {
System.out.println(file.getName());
}
}
//FileFilter接口本身是个过滤器的接口,重写接口可以过滤掉隐藏文件
if(file.isDirectory()){
File[] files=file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()) return true;
if (pathname.isHidden()) return false;
if (pathname.length()<200*1024) return true;
return false;
}
});
System.out.println(file.getName()+":/的子文件如下:");
for (File file2 : files) {
getDir(file2,j+1);
}
}
}