【Java零基础连载14】Java IO流精讲|字节流、字符流、缓冲流、序列化、文件读写实战

📅 发布时间:2026/7/14 19:17:51
【Java零基础连载14】Java IO流精讲|字节流、字符流、缓冲流、序列化、文件读写实战 ✨ 专栏Java零基础全套入门连载教程 简介本文承接上篇泛型高级特性内容正式开启Java IO编程核心篇章。IO流是Java实现文件读写、数据传输、本地持久化、网络通信的底层核心也是日常开发、爬虫、文件上传下载、框架底层必备基础知识点。很多开发者一直分不清字节流与字符流区别、缓冲流优势、IO关闭机制、序列化原理频繁出现文件乱码、数据丢失、资源泄露等问题。本文从零拆解IO流完整体系通俗易懂讲解各类流底层原理、适用场景搭配海量可直接运行的实战代码、避坑指南、面试考点零基础彻底吃透Java IO全套体系。 标签JavaIO,字节流,字符流,缓冲流,序列化,文件读写,Java零基础一、前言前面我们彻底搞定了Java集合框架、泛型高级特性补齐了Java代码复用、类型安全、数据存储的核心能力。但目前我们所有的数据全部存储在内存中程序关闭、断电即丢失无法实现数据持久化。想要实现文件读写、数据本地保存、上传下载、网络数据传输必须依靠Java IO流。IO流是Java和外部设备交互的唯一通道也是进阶NIO、Netty、网络编程、框架源码的前置基础。本篇从零由浅入深一次性搞定IO所有核心知识点IO体系分类、字节流、字符流、缓冲流、文件操作、对象序列化解决文件乱码、资源泄露、读写效率低等所有常见问题读完本篇你将彻底掌握IO流核心概念、输入输出原理、四大主流IO体系字节流原理、文件读写、适配场景所有类型文件字符流原理、解决中文乱码、适配文本文件场景缓冲流性能优化原理、大幅提升文件读写效率IO资源关闭机制、try-catch-finally标准写法对象序列化与反序列化、数据持久化核心原理各类流精准选型、实战避坑、高频面试考点二、IO流核心基础概念2.1 什么是IO流IInput 输入从外部设备读取数据到内存读OOutput 输出从内存写出数据到外部设备写流Stream数据传输的通道像水流一样源源不断传输数据。2.2 IO流四大分类核心体系Java IO流体系庞大但核心只有四大父类所有流都是其子类字节输入流InputStream 读任意文件字节数据字节输出流OutputStream 写任意文件字节数据字符输入流Reader 读文本文件字符数据字符输出流Writer 写文本文件字符数据2.3 字节流 vs 字符流 本质区别必背字节流传输字节01二进制万能流适配所有文件图片、视频、音频、文档、文本无乱码问题字符流传输字符专门适配纯文本文件自带编码解码高效解决中文乱码非文本文件会损坏数据三、字节流详解万能文件读写字节流是IO流中最通用的流底层直接操作二进制字节支持所有文件类型读写不存在文件格式限制。3.1 FileInputStream 文件字节输入流读作用读取本地文件的字节数据到内存中。3.1.1 单字节读取效率极低不推荐import java.io.FileInputStream; import java.io.IOException; public class FileInputStreamDemo { public static void main(String[] args) throws IOException { // 创建字节输入流对象绑定文件路径 FileInputStream fis new FileInputStream(test.txt); int data; // 循环读取单个字节读取完毕返回-1 while ((data fis.read()) ! -1) { System.out.print((char) data); } // 关闭流释放资源 fis.close(); } }3.1.2 字节数组读取实战推荐效率高import java.io.FileInputStream; import java.io.IOException; public class FileInputStreamArrayDemo { public static void main(String[] args) throws IOException { FileInputStream fis new FileInputStream(test.txt); // 定义字节数组缓冲区一次读取1024字节 byte[] buffer new byte[1024]; int len; // len代表本次实际读取的字节数 while ((len fis.read(buffer)) ! -1) { // 从0开始读取len长度的字节转为字符串 System.out.print(new String(buffer, 0, len)); } fis.close(); } }3.2 FileOutputStream 文件字节输出流写作用将内存中的字节数据写出到本地文件。核心特点默认覆盖原文件内容追加写入需要开启追加模式。import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStreamDemo { public static void main(String[] args) throws IOException { // 第二个参数true开启追加写入默认false覆盖 FileOutputStream fos new FileOutputStream(out.txt, true); // 写入字节数据 fos.write(Java IO流实战\r\n.getBytes()); // 关闭资源 fos.close(); } }3.3 字节流实战文件复制万能复制字节流可复制任意格式文件图片、视频、文档、压缩包零损坏。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(source.jpg); FileOutputStream fos new FileOutputStream(target.jpg); // 缓冲区读写 byte[] buffer new byte[1024]; int len; while ((len fis.read(buffer)) ! -1) { fos.write(buffer, 0, len); } // 先开后关依次释放资源 fos.close(); fis.close(); } }四、字符流详解解决文本乱码问题字节流操作文本时容易出现中文乱码、效率低问题Java专门提供字符流针对纯文本文件优化自带编码解码处理。4.1 FileReader 字符输入流读文本import java.io.FileReader; import java.io.IOException; public class FileReaderDemo { public static void main(String[] args) throws IOException { FileReader fr new FileReader(text.txt); char[] chars new char[1024]; int len; // 按字符读取文本内容完美适配中文 while ((len fr.read(chars)) ! -1) { System.out.print(new String(chars, 0, len)); } fr.close(); } }4.2 FileWriter 字符输出流写文本import java.io.FileWriter; import java.io.IOException; public class FileWriterDemo { public static void main(String[] args) throws IOException { FileWriter fw new FileWriter(write.txt, true); // 直接写入字符串无需转换 fw.write(Java字符流解决中文乱码\r\n); fw.flush(); // 刷新缓冲区强制写出数据 fw.close(); } }4.3 字符流核心坑点字符流只适用于纯文本文件txt、java、md图片视频使用会损坏文件字符流自带缓冲区不调用flush()/close()数据会滞留缓冲区无法写入文件默认跟随系统编码跨平台易乱码建议手动指定UTF-8编码五、缓冲流IO性能终极优化普通字节流、字符流是单字节/单字符频繁读写磁盘磁盘IO次数多效率极低。缓冲流内置大容量缓冲区一次性批量读写数据大幅减少磁盘交互次数IO性能提升数十倍企业开发首选。5.1 四大缓冲流BufferedInputStream字节缓冲输入流BufferedOutputStream字节缓冲输出流BufferedReader字符缓冲输入流独有readLine()逐行读取BufferedWriter字符缓冲输出流独有newLine()换行5.2 字符缓冲流实战文本文件最优方案import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class BufferedReaderDemo { public static void main(String[] args) throws IOException { // 包装普通字符流增强性能 BufferedReader br new BufferedReader(new FileReader(test.txt)); String line; // 逐行读取文本高效便捷 while ((line br.readLine()) ! null) { System.out.println(line); } br.close(); } }5.3 缓冲流核心原理缓冲流不直接操作文件只包装普通流内置8192字节/字符缓冲区读写时先操作缓冲区批量同步到磁盘极大降低IO消耗。六、IO资源释放标准try-catch-finally写法前面案例直接抛出异常实际开发严禁使用IO属于系统资源必须手动关闭释放否则会造成资源泄露、文件占用。6.1 标准资源释放写法import java.io.FileOutputStream; import java.io.IOException; public class IoCloseDemo { public static void main(String[] args) { FileOutputStream fos null; try { fos new FileOutputStream(safe.txt); fos.write(标准IO资源释放写法.getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { // finally代码块一定会执行保证资源关闭 if (fos ! null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } }6.2 JDK1.7 try-with-resources 简化写法自动实现资源关闭代码简洁企业开发主流写法import java.io.FileOutputStream; import java.io.IOException; public class TryResourceDemo { public static void main(String[] args) { // 括号内资源会自动关闭 try (FileOutputStream fos new FileOutputStream(autoClose.txt)) { fos.write(自动关闭IO资源.getBytes()); } catch (IOException e) { e.printStackTrace(); } } }七、对象序列化与反序列化面试高频7.1 什么是序列化序列化将内存中的Java对象转为字节数据可保存到文件、网络传输实现对象持久化。反序列化将磁盘/网络的字节数据还原为Java对象。7.2 序列化核心条件实体类必须实现Serializable 空接口标记接口无任何方法仅用于标记可序列化。7.3 序列化实战1. 实体类实现序列化接口import java.io.Serializable; // 实现Serializable接口开启序列化能力 public class User implements Serializable { // 序列化版本号保证版本兼容 private static final long serialVersionUID 1L; private String name; private Integer age; // 构造器、get、set、toString public User(String name, Integer age) { this.name name; this.age age; } Override public String toString() { return User{name name , age age }; } }2. 序列化与反序列化测试import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class SerializeDemo { public static void main(String[] args) { // 序列化对象写入文件 try (ObjectOutputStream oos new ObjectOutputStream(new FileOutputStream(user.obj))) { oos.writeObject(new User(张三, 20)); System.out.println(对象序列化成功); } catch (Exception e) { e.printStackTrace(); } // 反序列化文件读取对象 try (ObjectInputStream ois new ObjectInputStream(new FileInputStream(user.obj))) { User user (User) ois.readObject(); System.out.println(反序列化对象 user); } catch (Exception e) { e.printStackTrace(); } } }7.4 序列化核心坑点transient 关键字被修饰的成员变量不会参与序列化数据会丢失必须手动定义serialVersionUID否则类修改后反序列化会报错静态变量不属于对象不参与序列化八、IO流终极选型指南开发直接用文本文件读写、需要逐行操作BufferedReader / BufferedWriter首选非文本文件图片/视频/压缩包复制读写Buffered字节缓冲流简单少量文本写入FileReader / FileWriter对象持久化、网络对象传输序列化 ObjectStream绝对禁止使用单字节/单字符普通流效率极低九、本篇总结本篇彻底攻克Java IO流全套核心体系补齐Java文件操作、数据持久化基础能力掌握IO输入输出核心原理、字节流与字符流本质差异与适配场景熟练普通字节流、字符流文件读写与文件复制实战吃透缓冲流性能优化原理掌握企业级高效IO读写方案掌握IO资源标准释放方式杜绝资源泄露问题精通对象序列化与反序列化机制、版本兼容与核心坑点形成完整IO选型思维适配所有文件操作业务场景IO流是Java文件编程、网络编程、框架底层的核心基石熟练掌握本篇内容可轻松搞定文件上传下载、数据持久化、日志读写、文件解析等常规业务十、下期预告下一篇Java异常处理异常体系、编译/运行时异常、try-catch-finally、自定义异常实战解锁Java程序容错机制透彻讲解异常分类、异常执行流程、捕获与抛出规则、finally终极特性、自定义异常封装解决程序崩溃、报错混乱、异常不规范处理等问题写出健壮稳定的企业级代码持续更新Java零基础全套连载关注专栏从零学Java稳步进阶后端开发