就业班JavaSE高级部分day08 File类 递归笔记
File类:
IO:(Input输入, Output输出)
java.io.File类:
文件和目录路径名的抽象表示形式
java把电脑中的文件和文件夹(目录)封装为一个File类,可以使用File类对文件和文件夹进行操作
String -> File
绝对路径,相对路径
绝对路径:
是一个完整的路径,以盘符开始
相对路径:
是一个简化的路径
相对的是当前目录的的根目录
如果使用当前项目的根目录,路径可以简写
java.io.File类: 文件和目录的路径名的抽象表现形式, 主要用于文件和目录的创建, 查找和删除等操作
// 静态成员变量
static String pathSeparator: 路径分隔符的字符串形式
static char pathSeparatorChar: 路径分隔符的char形式
Windows系统是 分号;
Linux系统是 冒号:
static String separator: 文件名称分隔符的字符串形式
static char separatorChar: 文件名称分隔符的char形式
Window系统是 反斜杠\
Linux系统是 正斜杠/
当使用分隔符时可以
c: File.separator a File.separator b.txt
注意事项:
路径不区分大小写(win不区分, Linux Mac区分)
路径一般写成字符串,一个"\"是转义 所以要写两个"\\"
C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjkOlFOSrTPAb-ROkG2i_vds/bc17469f13b84f4bae3f984d17b9e1df/ac62373c05284a888f850ceace1f2ae0.jpg
构造方法:
File File(String pathname): 根据 路径字符串 封装一个File对象
File File(String parent, String child): 根据 父路径字符串 和 子路径字符串 封装File对象
File File(File parent, String child): 根据 父路径的File对象 和 子路径 封装File对象
获取方法:
java.io.File类
// 常用获取方法
String getAbsolutePath(): 返回此File的绝对路径名字符串
String getPath(): 获取File对象的封装路径 (创建对象时传入的路径)
String getName(): 获取File对象的文件名或目录名 d:\a\b\c\aaa.txt
long length(): 获取File表示的"文件"大小的字节byte数 (不能获取目录的大小)
如果是目录返回:"0"或者"4096"
判断方法:(常用)
boolean exists(): 判断File对象代表的文件或目录是否实际存在
boolean isDirectory(): 判断File表示的是否为目录
boolean isFile(): 判断File表示的是否为文件
创建删除方法:
java.io.File类
// 常用创建删除方法
boolean createNewFile(): 当文件不存在时, 创建一个新的空文件
false: 路径已经存在(无论文件还是目录)
抛IO异常: 写的路径不符合逻辑 (Y:\\a.txt\dsfsd)
boolean delete(): 删除由此File表示的文件或目录.
删除目录时: 必须是空目录
boolean mkdir(): 创建File表示的目录 "d:\\a\\b\\c\\我的目录"
false: 1. 路径已经存在(无论文件还是目录) 2. 写的路径不符合逻辑
boolean mkdirs(): 创建File表示的多级目录 "d:\\a\\b\\c\\我的目录"
false: 1. 路径已经存在(无论文件还是目录) 2. 写的路径不符合逻辑
遍历目录的方法:
java.io.File类
// 常用获取目录中内容的方法
[常用]String[] list(): 获取当前File目录下的所有子文件或目录的名字数组
File[] listFiles(): 获取当前File目录中的所有子文件或目录的File对象数组
注意:
只能用表示目录的File对象调用
用文件的File对象, 或者路径不存在, 调用会报错
递归:
递归思想:
遇到一个问题时, 将该问题拆解成可以解决的小问题, 如果解决不了, 继续拆解为更小的问题. 如果小问题解决了, 大问题也就能够解决
Java中实现递归的方式:
方法内部调用方法自己 (所以必须定义方法)
递归的分类:
直接递归: 方法自己调用方法
间接递归: A方法调用B方法, B方法调用C方法, C方法调用A方法
递归时的注意事项:
1. 递归要有限定条件(出口), 保证递归能够停止(就是在某种情况下方法不再调用自己), 否则会栈内存溢出
2. 递归次数不能太多, 否则会栈内存溢出
3. 构造方法不能递归
递归的使用前提:
调用方法时, 方法的主体不变, 但每次传递的参数值不同, 可以使用递归
递归打印多级目录
分析:
大问题:
打印aaa目录中"所有"子文件和子目录的路径 =
打印aaa目录中子文件和子目录的路径 + (打印bbb子目录中"所有"子文件
和子目录的路径)?
打印bbb子目录中"所有"子文件和子目录的路径 =
打印bbb子文件和子目录的路径 + (打印ccc子目录中"所有"子文
件和子目录的路径)?
打印ccc子目录中"所有"子文件和子目录的路径 = 打印ccc
子文件的路径
要解决的问题(定义的方法): 打印(File 某个目录)中"所有"子文件和子目录
的路径
代码实现:
出口: 没有子目录的时候 (方法不再递归调用方法自己)
共性的公式: 打印某个目录子文件和子目录的路径 + 递归调用方法(打印
子目录中"所有"子文件和子目录的路径)?
File[] listFiles()
for(File file : arr) {
if (是文件) {
直接操作
} else {
是目录, 就递归调用方法
}
}
FileFilter文件过滤器的原理和使用
java.io.File类: Filter过滤器
File[] listFiles(FileFilter filter): 返回文件过滤器过滤后的File对象数组
File[] listFiles(FilenameFilter filter): 返回文件过滤器过滤后的File对象数组
java.io.FileFilter接口: 用于File对象的过滤器
boolean accept(File pathName): true则会将参数的File对象加入返回的File[], false则不
加入
java.io.FilenameFilter接口: 将File对象拆分为父路径和子路径来判断的过滤器
boolean accept(File dir, String name): true则会将参数的File对象加入返回的File[], false
则不加入
dir: 被找到的文件所在的目录 (父路径)
name: 文件的名称 (子路径)
使用FileFilter:
// 自定义 java文件过滤器
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
// 规则:
// 如果是目录, 允许添加到数组, 因为我们需要目录来递归调用
// 如果是文件, 则判断是否为java文件, 是则允许添加到数组中
// 判断是不是目录
if (pathname.isDirectory()) {
// 允许添加到数组中
return true;
}
// 如果能执行到这里, 说明不是目录, 那肯定是文件, 则判断文件名后缀
boolean isJavaFile = pathname.getName().toLowerCase().endsWith(".java");
return isJavaFile;
}
}
public class Test {
public static void main(String[] args) {
File dir = new File("day08");
printJavaFile(dir);
}
public static void printJavaFile(File dir) {
// 获取当前目录下的子文件和子文件夹, 传入过滤器对象
FileFilterImpl fileFilter = new FileFilterImpl();
File[] childFiles = dir.listFiles(fileFilter);
// 现在数组中只有.java文件和子目录
for (File childFile : childFiles) {
if (childFile.isFile()) {
// 如果是文件, 那肯定是.java文件, 直接打印即可
System.out.println(childFile);
} else {
// 如果是目录, 仍然是递归调用
printJavaFile(childFile);
}
}
}
}
FilenameFilter文件过滤器的使用:
File[] files1 = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir, name).isDirectory() || name.toLowerCase().endsWith(".java");
}
});
|