A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

就业班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");
    }
});



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马