Java学习23
·
上午 3h
1. File 类完整学习
1.1 File 核心作用(重点必背)
File 不负责读写文件里面的内容!只负责:
- 定义文件 / 文件夹路径
- 创建文件、删除文件
- 判断是否是文件 / 文件夹
- 遍历文件夹下所有内容一句话:File 是操作「文件外壳、路径、文件夹」,IO 流才操作「文件里面的内容」
1.2 路径分类详解
- 绝对路径:从电脑盘符开始完整路径例:
D:\Java\a.txt - 相对路径:相对于当前项目根路径例:
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 创建功能 详解 + 完整代码
三个创建方法区别(必考)
createNewFile():创建普通文件(文本 / 空文件),只能建文件,不能建文件夹mkdir():创建单级空文件夹,多级会失败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():磁盘生成空文件,已存在则返回 falsemkdir():只能建一层,多层路径直接失败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());
}
}
}
✅ 大纲遗漏补充(重要必学)
- File 创建 / 删除不能递归删除带内容文件夹,后面要学递归遍历删除
- 路径分隔符静态常量
File.separator跨平台通用 - listFiles () 要做非空判断,防止空指针异常
下午 2.5h
2. IO 流概述
2.1 IO 含义
- I:Input 输入 读(从硬盘读到程序)
- O:Output 输出 写(从程序写到硬盘)
2.2 流分类
- 字节流:万能流,后缀
Stream可以读写:图片、视频、音频、文档、所有文件 - 字符流:后缀
Reader/Writer只能读写:纯文本文件(txt、java),不能读写图片视频
2.3 流向划分(必背)
- 输入流:硬盘 → 程序
- 输出流:程序 → 硬盘
3. 字节输出流 FileOutputStream
3.1 作用
程序 写出数据到硬盘文件
3.2 覆盖写入 / 追加写入区别
- 无第二个参数:覆盖原有内容
- 构造传
true:追加写入,不覆盖
3.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 个字节
- 一次读一个字节数组
- 循环读取全部内容
完整读取代码
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));
}
✅ 大纲遗漏补充
- IO 流必须处理异常
throws IOException - 用完流必须 close (),否则占用系统资源
- 字节流读取中文可能乱码(字符流解决)
晚上 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("文件复制完成");
}
}
逐行解释
- 输入流绑定原图片,输出流绑定新图片
- 1024 字节数组做缓冲区,高效读写
- 读到多少字节,就写入多少字节
- 最后先关输出流、再关输入流
✅ 大纲遗漏补充(极重要)
- 资源释放标准写法:try-catch-finally 保证一定关闭流
- 文件复制只能用字节流,图片视频不能用字符流
- 路径不存在时输入流会直接报错,要提前用 File 判断存在
Day23 过关标准(升级完整版)
- 能分清 File 只操作路径、IO 流操作内容
- 熟练手写 createNewFile /mkdir/mkdirs /delete 及判断方法
- 会用 listFiles () 遍历文件夹,会做非空判断
- 能区分字节流、字符流适用场景
- 熟练手写 FileOutputStream 覆盖 / 追加、单字节 / 数组写入
- 熟练手写 FileInputStream 循环读取
- 独立写出 字节流文件复制 代码
- 牢记流必须 close () 关闭资源
额外整体补充(你大纲完全没提,但必考)
- 相对路径默认指向项目根目录
- File 不能删除非空文件夹,后续需递归实现
- IO 流异常处理两种方式:throws 抛出、try-finally 捕获
- 字节流读中文乱码根源,为后天字符流做铺垫
- 缓冲区数组长度固定 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,程序崩溃 |
更多推荐

所有评论(0)