23Java基础之File

File与IO的简介

有些数据想长久保存起来,该怎么办?
image

  • 文件是非常重要的存储方式,在计算机硬盘中。
  • 即便断电,或者程序终止了,存储在硬盘文件中的数据也不会丢失。

1.File

  • File是java.io包下的类,File类的对象,用于代表当前操作系统的文件(可以是文件,或文件夹)。
    image
    注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据。

2.IO流

  • 用于读写数据的(可以读写文件,或网络中的数据...)

File:代表文本
IO流:读写数据

File

  • 创建File类的对象
    image
    注意:
  • File对象既可以代表文件、也可以代表文件夹。
  • File封装的对象仅仅是一个路径名,这个路径可以是存在的,也允许是不存在的。

案例

//目标:掌握File对象的创建,来代表具体的文件。
public class FileDemo01 {
    public static void main(String[] args) {
        //1. 创建File对象
        File f1 = new File("D:\\java_project\\resource\\test.jpg");
//        File f1 = new File("D:/java_project/resource/test.jpg");
//        File f1 = new File("E:" + File.separator + "java_project" + File.separator + "resource" + File.separator + "test.jpg");

        System.out.println(f1.length());// 字节个数

        //2. File对象可以代表文件,也可以代表文件夹。
        File f2 = new File("D:\\java_project\\resource");
        System.out.println(f2.length()); // 拿到的是文件夹本身的大小,不是里面全部内容的大小。

        //3.File对象的文件路径可以是不存在的
        File f3 = new File("E:\\a.txt");
        // 以后可以创建出来

        //4. File对象的路径可以支持绝对路径,相对路径。
        // 什么是绝对路径:从盘符开始的路径。(依赖于当前操作系统,适合找特定系统的特定位置的文件)
        File f4 = new File("D:\\java_project\\resource\\test.jpg");
        // 什么是相对路径:相对于项目目录的路径。(重点)说白了不带盘符,直接到project(工程)下找文件。
        // 一般是用来找项目中的资源文件的。很重要
        File f5 = new File("day08-stream-file-io\\src\\test.jpg");
        System.out.println(f5.length());
    }
}

File提供的判断文件类型、获取文件信息功能
image
案例

//目标:掌握File提供的判断文件类型、获取文件信息功能
public class fileTest2 {
    public static void main(String[] args) {
        //1. 创建文件对象,指代某个文件
        File f = new File("D:\\java_project\\resource\\test.jpg");

        //2. 判断当前文件对象,对应的文件路径是否存在,存在返回ture
        System.out.println(f.exists());

        //3. 判断当前文件对象指代的是否是文件,是文件返回ture,反之返回false
        System.out.println(f.isFile());

        //4. 判断当前文件对象指代的是否是文件夹,是文件夹返回ture,反之返回false
        System.out.println(f.isDirectory());

        //5. 获取文件的名称(包含后缀)
        System.out.println(f.getName());

        //6. 获取文件大小,返回字节数
        System.out.println(f.length());

        //7. 获取文件的最后修改时间
        long time = f.lastModified();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss EEE a");
        // 将时间戳转换为带时区的日期时间对象
        ZonedDateTime zonedDateTime = Instant.ofEpochMilli(time).atZone(ZoneId.systemDefault()); // 使用系统默认时区,也可指定如ZoneId.of("Asia/Shanghai")

        // 格式化并输出
        String formattedTime = dtf.format(zonedDateTime);
        System.out.println(formattedTime);

        //8. 获取创建文件对象时,使用的路径
        System.out.println(f.getPath());

        //9. 获取绝对路径
        System.out.println(f.getAbsoluteFile());

        // 找到真正的相对路径相对到哪里
        File file = new File("");
        System.out.println(file.getAbsoluteFile());
    }
}

File类创建文件的功能
image
File类删除文件的功能
image
注意:delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站。
案例

//目标:掌握File创建和删除文件的相关方法
public class fileTest3 {
    public static void main(String[] args) throws IOException {
        File f = new File("D:\\java_project\\resource\\b.txt");
        //1. 创建一个新文件(文件内容为空),创建成功返回true,否则返回false
        System.out.println(f.createNewFile());

        //2. 创建文件夹,注意只能创建一级文件夹。创建成功返回true,否则返回false
        File f2 = new File("D:\\java_project\\resource\\b\\asdf\\zzcv");
        System.out.println(f2.mkdir());

        //3.创建文件夹,可以创建多级文件夹(重点)
        System.out.println(f2.mkdirs());

        //4. 只能删除文件和空文件夹,不能删除非空文件夹
        f.delete();
        f2.delete();
    }
}

File类提供的遍历文件夹的功能
image

案例

//目标:掌握File提供的遍历文件夹的方法
public class FileTest4 {
    public static void main(String[] args) {
        File f = new File("D:\\java_project\\resource");
        String[] names = f.list();

        for(String name: names){
            System.out.println(name);
        }

        File[] files = f.listFiles();
        for(File file: files){
            System.out.println(file.getAbsoluteFile());
        }
    }
}

使用listFiles方法时的注意事项:

  • 当主调是文件,或者路径不存在时,返回null。
  • 当主调是空文件夹时,返回一个长度为0的数组。
  • 当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回,包含隐藏文件。
  • 当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件。
  • 当主调是一个文件夹,但是没有权限访问该文件夹时,返回null。

什么是方法递归?

  • 递归是一种算法,在程序设计语言中广泛应用。
  • 从形式上说:方法调用自身的形式称为方法递归(recursion)。

递归的形式

  • 直接递归:方法自己调用自己。
  • 间接递归:方法调用其他方法,其他方法又回调方法自己。

使用方法递归时需要注意的问题:

  • 递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出错误。
    案例
//目标:认识递归的形式
public class RecursionTest1 {
    public static void main(String[] args) {
        test1(); // 直接递归
        test2(); // 间接递归
    }

    public static void test1(){
        System.out.println("test1");
        test1();
    }

    public static void test2(){
        System.out.println("test2");
        test3();
    }

    private static void test3() {
        test2();
    }
}

递归的案例-计算n的阶乘
需求:计算n的阶乘,5的阶乘=12345;6的阶乘是12345*6;
分析:

  1. 假如我们认为存在一个公式是f(n)=1234567...(n-1)n;
  2. 那么公式等价形式就是:f(n)=f(n-1)*n
  3. 如果求的是1-5的阶乘的结果,我们手工应该如果应用上述公式计算。
    image
//目标:递归的算法基础:解决求阶乘
public class RecursionTest2 {
    public static void main(String[] args) {
        System.out.println(getJieCheng(5));
    }

    public static int getJieCheng(int n){
        if(n == 1) return 1;
        return getJieCheng(n - 1)* n;//递归
    }
}

递归算法三要素:

  • 递归的公式:f(n)=f(n-1)*n;
  • 递归的终结点:f(1)
  • 递归的方向必须走向终结点:
    image

案例:猴子吃桃问题

  • 猴子第一天摘下若干桃子,当即吃了一半,觉得好不过瘾,于是又多吃了一个第二天又吃了前天剩余桃子数量的一半,觉得好不过瘾,于是又多吃了一个以后每天都是吃前天剩余桃子数量的一半,觉得好不过瘾,又多吃了一个等到第10天的时候发现桃子只有1个了。
  • 需求:请问猴子第一天摘了多少个桃子?
//目标:猴子吃桃问题
public class RecursionTest3 {
    public static void main(String[] args) {
        //1. 公式 f(x + 1) = f(x) - f(x)/2 -1;
        //   变形:f(x) = 2f(x+1) + 2
        //2. 终结点:f(10) = 1
        //3. 递归的方向:f(1)= ?
        System.out.println(f(1));
    }

    public static int f(int n){
        if(n == 10) return 1;

        return 2*f(n + 1) + 2;
    }
}

案例:文件搜索
需求:从某个盘符下,搜索“QQ.exe”这个文件,找到后直接输出其位置。

//目标:文件搜索
public class RecursionTest4 {
    public static void main(String[] args) throws IOException {
        File dir = new File("E:\\");
        searchFile(dir, "QQ.exe");
    }

    /**
     * 搜索指定目录下的指定文件
     * @param dir 要搜索的目录
     * @param fileName 要搜索的文件
     */
    private static void searchFile(File dir, String fileName) throws IOException {
        //1. 极端判断
        if(dir == null || !dir.exists() || dir.isFile()){
            return;
        }

        //2. 搜索文件
        // 提取当前目录下的全部一级文件对象
        File[] files = dir.listFiles();

        //3. 判断这个文件夹是否可以提取一级文件对象,以及是否存在一级文件对象,存在才可以搜索
        if(files == null || files.length == 0) {
            return;
        }

        //4. 遍历一级文件对象
        for(File file: files){
            if(file.isFile()){
                //是文件
                // 看看这个文件是否就是要查找的
                if(file.getName().contains(fileName)){
                    System.out.println(file.getAbsolutePath());

                    //启动这个程序
                    Runtime r = Runtime.getRuntime();
                    r.exec(file.getAbsolutePath());
                    return;
                }
            }
            else{
                //是文件夹
                // 递归搜索
                searchFile(file, fileName);
            }
        }
    }
}
posted @ 2025-09-10 10:31  狂风将军  阅读(13)  评论(0)    收藏  举报