Day 08File类、递归
一、File类
1.1 简介
java.io.File
类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
1.2 构造方法
-
用路径字符串构造
public File(String name)
-
用父路径字符串+子路径字符串构造
public File(String parent,String child)
-
用父抽象路径(目录实例)+子路径
public File(File parent,String child)
创建一个File实例时,对应一个硬盘上一个实际存在的文件或目录。但是不管给的路径上是否确实有文件/目录存在,都不会影响对象的创建
1.3 常用方法
-
getAbsolutePath()
返回此File的绝对路径字符串 -
getPath()
将此File转换为路径名字符串 -
getName()
:返回由此File表示的文件或目录的名称。 -
p length()
:返回由此File表示的文件的长度。
public class Day08 {
public static void main(String[] args) throws IOException {
File f = new File("a.txt");
System.out.println(f.getAbsolutePath());
//C:\Users\wudan\eclipse-workspace\Jinjie\a.txt
System.out.println(f.getPath());//构造路径 输出:a.txt
System.out.println(f.getName());//a.txt
System.out.println(f.length());//0(因为文件不存在)
File f2 = new File("D:\\Matlab");
System.out.println(f2.getAbsolutePath());//D:\Matlab
System.out.println(f2.getPath());//D:\Matlab
System.out.println(f2.getName());//Matlab
System.out.println(f2.length());//20480
//对于目录类
}
}
绝对路径:从盘符开始计算的路径如D:\…。相对路径:从项目目录开始算起的路径,相对方便,如上述代码中a.txt用的就是相对路径。
几个常用的判断方法:
public boolean exists()
:此File表示的文件或目录是否实际存在。public boolean isDirectory()
:此File表示的是否为目录。public boolean isFile()
:此File表示的是否为文件。
创建与删除功能:
public boolean creatNewFile()
创建一个新的空文件,前提是该文件原本不存在public boolean delete()
删除由此File代表的文件或目录,删除目录的时候,只有目录下不存在文件或别的目录才能操作成功public boolean mkdir()
创建File代表的目录。public boolean mkdirs()
创建File代表的目录,包括任何必须但不存在的父目录
public static void main(String[] args) throws IOException {
File f = new File("D:\\test\\text");
File f2 = new File(f,"a.txt");
System.out.println(f.mkdir());
System.out.println(f.mkdirs());
System.out.println(f2.createNewFile());
System.out.println("以上为创建测试");
System.out.println(f.exists()+ " " +f2.exists());
System.out.println(f.isFile()+" "+f.isDirectory());
System.out.println(f2.isFile()+" "+f2.isDirectory());
System.out.println("以上为判断存在测试");
System.out.println(f.delete());
System.out.println(f2.delete());
System.out.println(f.delete());
}
/*
false
true
true
以上为创建测试
true true
false true
true false
以上为判断存在测试
false
true
true
*/
1.4 遍历目录
-
public String[] list()
:返回一个String数组,表示该File目录中的所有子文件或目录。 -
public File[] listFiles()
:返回一个File数组,表示该File目录中的所有的子文件或目录。
public static void main(String[] args) throws IOException {
File f= new File("D:\\Matlab");
String [] s = f.list();
for(String string : s) {
System.out.println(string);
}
System.out.println("_______________________");
File[] files = f.listFiles();
for(File file : files) {
System.out.println(file.getAbsolutePath());
}
}
二、 递归
2.1 递归的简介
递归指的是自己调用自己的情况,一般可以分为两种:
-
方法A中又调用了方法A,自己直接调用自己
-
方法A调用了B,方法B调用了C,C调用了A 即A间接调用了自己
-
需要注意的是,递归一定要有限制条件能停止递归(不能死循环递归),否则不断地调用会导致栈n内存溢出,即使有限制,递归次数也不能过多
-
在构造的时候,禁止递归
-
2.2 递归求和与阶乘
求和:
public static void main(String[] args) throws IOException {
System.out.println(getSum(5));
}
private static int getSum(int i) {
if(i == 1) {
return 1;
}else {
return i + getSum(i-1);
}
}
求阶乘:就是把retun i + getSum(i-1)
改为 return i*getSum(i-1)
2.3 递归打印多级目录
public static void main(String[] args) throws IOException {
File f= new File("D:\\Matlab");
getDirectiory(f);
}
private static void getDirectiory(File f) {
File[] files = f.listFiles();
for(File file : files) {
if(file.isDirectory()) {
System.out.println(f.getAbsolutePath());
getDirectiory(file);
}
else {
System.out.println(file.getAbsolutePath());
}
}
}
2.4 文件搜索
查询此目录下所有的txt文件,只需对2.3的代码中else部分作如下修改
else {
if(file.getName().endsWith(".txt")){
System.out.println(file.getName());}
}
三、文件过滤器
3.1 文件过滤器优化
java.io.FileFilter
是一个接口,是File的过滤器。 该接口的对象可以传递给File类的listFiles(FileFilter)
作为参数, 接口中只有一个方法:
boolean accept(File pathname)
:测试pathname是否应该包含在当前File目录中,符合则返回true。
通过过滤器进行优化,筛选需要的文件,如果是目录则再进到目录里进行遍历过滤。
采用过滤器的方式,查找刚才的.txt文件
public static void main(String[] args) throws IOException {
File f= new File("D:\\Matlab");
getDirectiory(f);
}
private static void getDirectiory(File f) {
File[] files = f.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
return pathname.getName().endsWith(".txt")||pathname.isDirectory();
}
});
for(File file : files) {
if(file.isDirectory()) {
getDirectiory(file);
}
else {
System.out.println(file.getAbsolutePath());
}
}
}
先筛选,再遍历,只要不是目录,就一定是.txt文件
3.2Lambda优化
由于接口中有且仅有一个accept函数,所以可以使用λ表达式,代替匿名内部类:
private static void getDirectiory(File f) {
File[] files = f.listFiles(pathname -> pathname.isDirectory()||pathname.getName().endsWith(".txt"));
for(File file : files) {
if(file.isDirectory()) {
getDirectiory(file);
}
else {
System.out.println(file.getAbsolutePath());
}
}
}
- 仅有一个参数 (pathname) 可以去掉小括号
- 只有一条语句块,可以省略
return
,语句分号,大括号