今天学的东西比较少,但是都比较重要。这篇文章主要通过文件递归遍历和斐波那契数列两个例子来介绍File类和递归的使用。
递归数列的介绍:
斐波那契数列,又称黄金分割数列,指的是这样一个数列:
1、1、2、3、5、8、13、21、……
//使用递归输出斐波那契数列1、1、2、3、5、8、13、。。的第20个数
public class Test01 {
public static void main(String[] args) {
int n=20;
int number=result(n);
System.out.println("number = " + number);
}
private static int result(int n) {
if(n==1||n==2) return 1;
else return result(n-1)+result(n-2);
}
}
文件递归遍历:遍历所有
//扫描D:\test所有子文件夹及子子文件夹下的.jpg文件,输出其绝对路径
public class Test01 {
public static void main(String[] args) {
File parent = new File("D:\\test");
scanFolderAndFile(parent);
}
//自定义函数扫描文件或者文件夹
public static void scanFolderAndFile(File parent) {
//通过父目录对象调用函数获取所有儿子的File数组
File[] dirs = parent.listFiles();
//循环遍历所有的儿子,dir表示父目录D:\\test的每一个儿子
for (File dir : dirs){
if(dir.isDirectory()){
scanFolderAndFile(dir);
}else {
if(dir.getName().endsWith(".jpg")){
System.out.println(dir.getAbsolutePath());
}
}
}
}
}
再加一个file过滤器的例子吧,关于过滤器底层的实现需要注意一下。
public class Test01 {
public static void main(String[] args) {
File file = new File("D:\\test");
File[] files = file.listFiles(pathname ->pathname.isFile() && pathname.getName().endsWith(".jpg"));
for (File file2 : files) {
System.out.println(file2.getAbsolutePath());
}
}
}
关于file过滤器的源码实现如下图所示:
public File[] listFiles(FileFilter filter) {
String ss[] = list();
if (ss == null) return null;
ArrayList<File> files = new ArrayList<>();
for (String s : ss) {
File f = new File(s, this);
if ((filter == null) || filter.accept(f))
files.add(f);
}
return files.toArray(new File[files.size()]);
}
上面的这段代码listFiles(FileFilter filter)源码:
1)File f = new File(s, this);
在jdk中,只有public方法。File类中共有六个构造方法,两个私有的。而File f = new File(s, this);就是其中一个私有构造方法。
2)判断过滤器是否为空,若为空,则直接添加到集合中(相当于没过滤,没意义)
若不为空,则执行filter.accept(f),将符合条件的对象放到集合中去。
if ((filter == null) || filter.accept(f))
files.add(f);