javaIO的基础认知

路线

第一阶段:Java IO 基础认知

1. 先搞懂核心概念

  • 什么是 IO:输入(Input)读数据输出(Output)写数据
  • IO 操作的核心对象:文件(File)、流(Stream)
  • 阻塞 / 非阻塞、同步 / 异步的基础区别
  • IO 的核心分类:字节流字符流

2. 掌握 File 类(操作文件 / 目录)

这是 IO 的入口,必须熟练:

  • 创建、删除、重命名文件 / 目录
  • 判断文件类型、获取文件大小 / 路径
  • 遍历文件夹(递归遍历)

第二阶段:传统 BIO(阻塞 IO)核心

Java 最基础、使用最广泛的 IO,日常开发 80% 场景都用这个

1. 字节流(万能流,操作所有文件)

  • 顶层父类:InputStreamOutputStream
  • 常用实现类:
    • FileInputStream / FileOutputStream(文件字节流)
    • BufferedInputStream / BufferedOutputStream(缓冲字节流,提高效率)
  • 核心用法:复制文件、读取图片 / 视频 / 音频等二进制文件

2. 字符流(专门操作文本文件)

  • 解决中文乱码问题,只适合读写纯文本
  • 顶层父类:ReaderWriter
  • 常用实现类:
    • FileReader / FileWriter
    • BufferedReader / BufferedWriter(高效缓冲字符流)
  • 核心用法:读取文本内容、按行读写

3. 转换流 + 打印流(解决乱码、简化输出)

  • InputStreamReader / OutputStreamWriter:字节 ↔ 字符转换
  • PrintStream / PrintWriter:简化输出,常用在日志打印

4. 对象流(序列化,面试高频)

  • ObjectInputStream / ObjectOutputStream
  • 对象序列化、反序列化
  • Serializable 接口、transient 关键字

5. BIO 收尾:IO 异常处理 + 资源关闭

  • JDK7+ try-with-resources 自动关闭流(必学)
  • 避免资源泄漏

第三阶段:Java NIO

BIO 的升级版,高并发编程必备,Netty 框架的底层就是 NIO。

1. NIO 三大核心组件(必须背下来)

  1. Buffer(缓冲区):数据容器,替代传统流
  2. Channel(通道):数据传输通道,双向传输
  3. Selector(选择器):实现非阻塞的核心,一个线程管理多个连接

2. 基础 NIO 操作

  • Buffer 的核心方法:put()get()flip()clear()
  • FileChannel:文件 NIO 操作(文件复制、大文件读写)
  • 分散读取、聚集写入

3. 网络 NIO(重点)

  • ServerSocketChannelSocketChannel
  • 实现非阻塞服务器、客户端
  • 理解:单线程处理多个客户端连接

4. NIO 关键特性

  • 非阻塞、同步、面向缓冲区
  • 对比 BIO:BIO 一个连接一个线程,NIO 一个线程管理多个连接

第四阶段:Java AIO

  • JDK7+ 引入,全称 Asynchronous IO
  • 真正的异步非阻塞,无需轮询,操作系统完成后主动通知
  • 适用场景:极高并发连接
  • 企业开发极少直接使用,了解原理即可,不用深入手写代码

第五阶段:IO 高级工具与实战

1. commons-io 工具包(Apache 开源,开发必用)

  • 简化文件操作:FileUtilsIOUtils
  • 一行代码实现文件复制、读取、写入

2. NIO.2(JDK7+ Path、Files、Paths)

  • 替代老旧的 File
  • 更优雅的文件操作 API

3. 经典实战案例

  • 大文件分片上传 / 下载
  • 文件夹递归拷贝
  • 简单聊天程序(BIO 版 + NIO 版)
  • 配置文件读取、日志写入

javaIO的基础认知

一、IO 核心概念(大白话版)

1. IO 定义

  • I = Input输入 :从外部读数据到程序内存(读)

    例:读取本地文件、读取网络请求数据

  • O = Output 输出:从程序内存写数据到外部(写)

    例:写入本地文件、响应网络数据

2. 核心载体

  1. 文件 File:数据的持久化存储载体(本地磁盘文件 / 文件夹)
  2. 流 Stream:数据传输的管道,数据以字节 / 字符形式单向流动

3. 两大流分类(核心区分)

  1. 字节流
    • 顶层父类:InputStream / OutputStream
    • 单位:字节,万能流
    • 适用:图片、视频、音频、压缩包、任意文件
  2. 字符流
    • 顶层父类:Reader / Writer
    • 单位:字符,自带编码处理
    • 适用:纯文本(txt、md、java、配置文件),解决中文乱码

4. 同步 / 异步 & 阻塞 / 非阻塞(前置理解)

类型 核心特点 对应 IO 模型
同步阻塞 BIO 等操作完成才放行,单连接单线程 传统文件 IO、普通网络 IO
同步非阻塞 NIO 线程不卡死,轮询等待就绪事件 NIO/Netty 底层
异步 AIO 系统完成操作后主动回调通知 JDK7 AIO,极少使用

二、File 类 全功能实战

1. File 类作用

专门用来操作文件 / 文件夹的路径、属性、创建、删除、遍历

注意:File 只操作文件元数据,不能读写文件内容(读写需要流)

2. 三种路径写法

1
2
3
4
5
6
// 1. 绝对路径(固定位置)
File file1 = new File("D:/test/demo.txt");
// 2. 相对路径(项目根目录为基准)
File file2 = new File("demo.txt");
// 3. 跨平台分隔符(推荐,避免系统兼容问题)
File file3 = new File(File.separator + "demo.txt");

3. 常用基础方法(判断 + 获取信息)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.io.File;

public class FileDemo {
public static void main(String[] args) {
File file = new File("D:/test/demo.txt");

// 判断
System.out.println("是否存在:" + file.exists());
System.out.println("是否是文件:" + file.isFile());
System.out.println("是否是文件夹:" + file.isDirectory());
System.out.println("是否可读:" + file.canRead());

// 获取信息
System.out.println("绝对路径:" + file.getAbsolutePath());
System.out.println("文件名:" + file.getName());
System.out.println("文件大小(字节):" + file.length());
}
}

4. 文件 / 文件夹 创建 & 删除

1
2
3
4
5
6
7
8
9
10
11
12
13
File file = new File("D:/test/123.txt");
File dir = new File("D:/test/ioDir");

// 创建单层文件夹
dir.mkdir();
// 创建多级文件夹(常用)
dir.mkdirs();

// 创建空文件
file.createNewFile();

// 删除文件/空文件夹(直接删除,不走回收站)
file.delete();

5. 文件夹遍历

方式 1:简单遍历(一级目录)

1
2
3
4
5
6
File dir = new File("D:/test");
// 获取当前目录下所有文件&文件夹名
String[] list = dir.list();
for (String name : list) {
System.out.println(name);
}

方式 2:获取 File 对象(常用)

1
2
3
4
5
6
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
System.out.println(f.getAbsolutePath());
}
}

方式 3:递归遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 递归遍历指定目录下所有文件
*/
public static void listAllFile(File dir) {
if (!dir.exists() || !dir.isDirectory()) {
return;
}
File[] files = dir.listFiles();
if (files == null) return;

for (File file : files) {
if (file.isDirectory()) {
// 是文件夹,递归继续遍历
listAllFile(file);
} else {
// 是文件,打印路径
System.out.println(file.getAbsolutePath());
}
}
}

javaIO的基础认知
http://hanqichuan.com/2026/04/20/java的IO/javaIO的基础认知/
作者
韩启川
发布于
2026年4月20日
许可协议