上午 3h

1. File 类完整学习

1.1 File 核心作用(重点必背)

File 不负责读写文件里面的内容!只负责:

  • 定义文件 / 文件夹路径
  • 创建文件、删除文件
  • 判断是否是文件 / 文件夹
  • 遍历文件夹下所有内容一句话:File 是操作「文件外壳、路径、文件夹」,IO 流才操作「文件里面的内容」

1.2 路径分类详解

  1. 绝对路径:从电脑盘符开始完整路径例:D:\Java\a.txt
  2. 相对路径:相对于当前项目根路径例:a.txt 直接在项目根目录下

1.3 File 构造方法

java

运行

// 1. 传入字符串路径
File f1 = new File("D:\\Java\\a.txt");
// 2. 父路径 + 子路径
File f2 = new File("D:\\Java", "a.txt");

注意:Java 里路径 \ 要写 \\ 转义,也可以写 /

1.4 创建功能 详解 + 完整代码

三个创建方法区别(必考)
  1. createNewFile()创建普通文件(文本 / 空文件),只能建文件,不能建文件夹
  2. mkdir():创建单级空文件夹,多级会失败
  3. mkdirs():创建多级文件夹(推荐日常用)
完整可运行代码

java

运行

import java.io.File;
import java.io.IOException;

public class FileCreateDemo {
    public static void main(String[] args) throws IOException {
        // 1. 定义文件路径
        File file = new File("D:\\JavaDay17\\test.txt");
        // 2. 创建普通文件
        boolean b1 = file.createNewFile();
        System.out.println("文件创建是否成功:" + b1);

        // 3. 单级文件夹
        File dir1 = new File("D:\\JavaDay17\\文件夹1");
        boolean b2 = dir1.mkdir();
        System.out.println("单级文件夹创建:" + b2);

        // 4. 多级文件夹(大纲重点)
        File dir2 = new File("D:\\JavaDay17\\a\\b\\c");
        boolean b3 = dir2.mkdirs();
        System.out.println("多级文件夹创建:" + b3);
    }
}

逐行解释

  • new File(路径):只是在内存定义路径,还没真正创建
  • createNewFile():磁盘生成空文件,已存在则返回 false
  • mkdir():只能建一层,多层路径直接失败
  • mkdirs():自动补全所有层级,开发首选

1.5 删除功能 delete ()

  • 只能删除空文件夹、普通文件
  • 不能删除带内容的文件夹

java

运行

File f = new File("D:\\JavaDay17\\test.txt");
System.out.println(f.delete() ? "删除成功" : "删除失败");

1.6 判断 & 获取方法(必背)

  • exists():是否存在
  • isFile():是否是普通文件
  • isDirectory():是否是文件夹
  • getName():获取名称
  • getAbsolutePath():获取绝对路径

完整案例:

java

运行

File f = new File("D:\\JavaDay17\\test.txt");
System.out.println("是否存在:" + f.exists());
System.out.println("是否是文件:" + f.isFile());
System.out.println("是否是文件夹:" + f.isDirectory());
System.out.println("文件名:" + f.getName());

1.7 遍历文件夹 list () /listFiles ()

区别
  • list():返回 String[] 只获取名称
  • listFiles():返回 File[] 获取完整 File 对象(开发常用)

完整遍历代码:

java

运行

public class FileListDemo {
    public static void main(String[] args) {
        File dir = new File("D:\\JavaDay17");
        // 方式1:只拿名字
        String[] names = dir.list();
        for (String name : names) {
            System.out.println("文件名:" + name);
        }

        // 方式2:拿File对象(可继续判断、操作)
        File[] files = dir.listFiles();
        for (File f : files) {
            System.out.println(f.getAbsolutePath());
        }
    }
}

✅ 大纲遗漏补充(重要必学)

  1. File 创建 / 删除不能递归删除带内容文件夹,后面要学递归遍历删除
  2. 路径分隔符静态常量 File.separator 跨平台通用
  3. listFiles () 要做非空判断,防止空指针异常

下午 2.5h

2. IO 流概述

2.1 IO 含义

  • I:Input 输入 (从硬盘读到程序)
  • O:Output 输出 (从程序写到硬盘)

2.2 流分类

  1. 字节流:万能流,后缀 Stream可以读写:图片、视频、音频、文档、所有文件
  2. 字符流:后缀 Reader/Writer只能读写:纯文本文件(txt、java),不能读写图片视频

2.3 流向划分(必背)

  • 输入流:硬盘 → 程序
  • 输出流:程序 → 硬盘

3. 字节输出流 FileOutputStream

3.1 作用

程序 写出数据到硬盘文件

3.2 覆盖写入 / 追加写入区别

  1. 无第二个参数:覆盖原有内容
  2. 构造传 true追加写入,不覆盖

3.3 三种写入方式

  1. 写入单个字节
  2. 写入整个字节数组
  3. 写入字节数组指定范围

完整可运行代码 + 逐行解释

java

运行

import java.io.FileOutputStream;
import java.io.IOException;

public class FOSDemo {
    public static void main(String[] args) throws IOException {
        // 1. 创建字节输出流:覆盖模式
        FileOutputStream fos = new FileOutputStream("D:\\JavaDay17\\write.txt");

        // 写入单个字节
        fos.write(97); // 97对应ASCII a

        // 写入字节数组
        byte[] arr = "Hello Java IO".getBytes();
        fos.write(arr);

        // 关闭流(必做)
        fos.close();
    }
}

逐行解释

  • new FileOutputStream(路径):文件不存在则自动创建,存在则清空覆盖
  • write(数字):按 ASCII 写入字节
  • 字符串.getBytes():字符串转字节数组
  • close():释放系统资源,必须写

追加写入代码

java

运行

// 第二个参数true = 追加不覆盖
FileOutputStream fos = new FileOutputStream("D:\\JavaDay17\\write.txt", true);

4. 字节输入流 FileInputStream

4.1 作用

把硬盘文件内容 读取到程序中

4.2 三种读取方式

  1. 一次读 1 个字节
  2. 一次读一个字节数组
  3. 循环读取全部内容

完整读取代码

java

运行

import java.io.FileInputStream;
import java.io.IOException;

public class FISDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("D:\\JavaDay17\\write.txt");

        // 一次读1个字节
        int b;
        while ((b = fis.read()) != -1) {
            System.out.print((char) b);
        }

        fis.close();
    }
}

核心:读到末尾返回 -1,用循环读完所有内容

数组高效读取(开发常用)

java

运行

byte[] buf = new byte[1024];
int len;
while ((len = fis.read(buf)) != -1) {
    System.out.print(new String(buf, 0, len));
}

✅ 大纲遗漏补充

  1. IO 流必须处理异常 throws IOException
  2. 用完流必须 close (),否则占用系统资源
  3. 字节流读取中文可能乱码(字符流解决)

晚上 1.5h

5. 综合实操

5.1 实操 1:File 遍历本地文件夹

复用前面 listFiles() 代码,可遍历指定目录所有文件

5.2 实操 2:字节流实现文件复制(图片 / 文档通用)

原理:一边读、一边写FileInputStream 读 → FileOutputStream 写

完整可运行复制代码(重点必背)

java

运行

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopyDemo {
    public static void main(String[] args) throws IOException {
        // 源文件(要复制的)
        FileInputStream fis = new FileInputStream("D:\\JavaDay17\\1.jpg");
        // 目标文件(复制到这里)
        FileOutputStream fos = new FileOutputStream("D:\\JavaDay17\\copy.jpg");

        // 字节数组缓冲
        byte[] buf = new byte[1024];
        int len;
        // 循环读取、循环写入
        while ((len = fis.read(buf)) != -1) {
            fos.write(buf, 0, len);
        }

        // 关闭资源 先开后关
        fos.close();
        fis.close();
        System.out.println("文件复制完成");
    }
}

逐行解释

  1. 输入流绑定原图片,输出流绑定新图片
  2. 1024 字节数组做缓冲区,高效读写
  3. 读到多少字节,就写入多少字节
  4. 最后先关输出流、再关输入流

✅ 大纲遗漏补充(极重要)

  1. 资源释放标准写法:try-catch-finally 保证一定关闭流
  2. 文件复制只能用字节流,图片视频不能用字符流
  3. 路径不存在时输入流会直接报错,要提前用 File 判断存在

Day23 过关标准(升级完整版)

  1. 能分清 File 只操作路径、IO 流操作内容
  2. 熟练手写 createNewFile /mkdir/mkdirs /delete 及判断方法
  3. 会用 listFiles () 遍历文件夹,会做非空判断
  4. 能区分字节流、字符流适用场景
  5. 熟练手写 FileOutputStream 覆盖 / 追加、单字节 / 数组写入
  6. 熟练手写 FileInputStream 循环读取
  7. 独立写出 字节流文件复制 代码
  8. 牢记流必须 close () 关闭资源

额外整体补充(你大纲完全没提,但必考)

  1. 相对路径默认指向项目根目录
  2. File 不能删除非空文件夹,后续需递归实现
  3. IO 流异常处理两种方式:throws 抛出、try-finally 捕获
  4. 字节流读中文乱码根源,为后天字符流做铺垫
  5. 缓冲区数组长度固定 1024 倍数,行业规范

下面这个版本观看更方便

最终稳定版(复制直接用,永远结果一致)

java

运行

import java.io.File;
import java.io.IOException;

public class FileCreateDemo {
    public static void main(String[] args) throws IOException {

        // ==============================================
        // 固定第一步:先把父文件夹建好(万能、永远成功)
        // ==============================================
        File parentDir = new File("D:\\JavaDay17");
        parentDir.mkdirs();

        // ==============================================
        // 1. 创建文件(只判断,不看true/false,避免混乱)
        // ==============================================
        File file = new File(parentDir, "test.txt");
        if (!file.exists()) {  // 不存在才创建
            file.createNewFile();
        }

        // ==============================================
        // 2. 创建单级文件夹
        // ==============================================
        File dir1 = new File(parentDir, "文件夹1");
        if (!dir1.exists()) { // 不存在才创建
            dir1.mkdir();
        }

        // ==============================================
        // 3. 创建多级文件夹
        // ==============================================
        File dir2 = new File(parentDir, "a\\b\\c");
        dir2.mkdirs(); // 永远稳

        // ==============================================
        // 最后统一打印结果(永远一样)
        // ==============================================
        System.out.println("文件是否存在:" + file.exists());
        System.out.println("文件夹1是否存在:" + dir1.exists());
        System.out.println("a/b/c 是否存在:" + dir2.exists());
    }
}

必背的核心区别(记死)

表格

流类型 作用 文件不存在时的行为
FileOutputStream 写文件 自动创建文件
FileInputStream 读文件 抛出 FileNotFoundException,程序崩溃

更多推荐