跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java IO 流:核心原理与实战应用

Java IO 流涵盖字节流与字符流的核心用法,通过 InputStream/OutputStream 处理二进制数据,Reader/Writer 处理文本编码。缓冲流提升效率,转换流解决乱码,对象流实现序列化。实战中优先使用 try-with-resources 管理资源,结合缓冲区优化大文件操作,避免常见异常如文件未找到或编码错误。

云间运维发布于 2026/3/24更新于 2026/10/2486 浏览
Java IO 流:核心原理与实战应用

IO 流体系图

Java IO 流概述

IO 流(Input/Output Stream)是 Java 处理设备间数据传输的核心技术,主要负责数据的读取和写入。无论是文件操作还是网络通信,理解以流的方式处理数据都是必备技能。

核心概念与分类

Java IO 流体系庞大,主要按三个维度划分:

按数据流向:输入流(InputStream/Reader)从外部读入程序,输出流(OutputStream/Writer)从程序写入外部。

按数据类型:字节流处理任意二进制数据(图片、视频等),字符流专门处理文本并自动管理编码。

按功能:节点流直接连接数据源,处理流包裹节点流以增强功能(如缓冲、转换)。

字节流实战

文件读写基础

FileInputStream 和 FileOutputStream 是最常用的字节流。单字节读取效率极低,实际开发中推荐使用字节数组缓冲区。

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

public class FileInputStreamDemo {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("test.txt");
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) != -1) {
                System.out.print(new String(buffer, 0, len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }  {
             (fis != ) {
                 { fis.close(); }  (IOException e) { e.printStackTrace(); }
            }
        }
    }
}
finally
if
null
try
catch

写入时需注意覆盖与追加模式。默认覆盖,构造方法传入 true 可开启追加。

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

public class FileOutputStreamDemo {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        try {
            // 第二个参数 true 表示追加模式
            fos = new FileOutputStream("output.txt", true);
            fos.write("追加内容".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try { fos.close(); } catch (IOException e) { e.printStackTrace(); }
            }
        }
    }
}
文件拷贝技巧

文件拷贝是典型场景,核心在于边读边写。合理设置缓冲区大小(如 8KB)能显著提升效率。

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

public class FileCopyDemo {
    public static void main(String[] args) {
        String sourcePath = "source.jpg";
        String targetPath = "target_copy.jpg";
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream(sourcePath);
            fos = new FileOutputStream(targetPath);
            byte[] buffer = new byte[1024 * 8];
            long startTime = System.currentTimeMillis();
            int len;
            while ((len = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
            long endTime = System.currentTimeMillis();
            System.out.println("耗时:" + (endTime - startTime) + "ms");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) fos.close();
                if (fis != null) fis.close();
            } catch (IOException e) { e.printStackTrace(); }
        }
    }
}

字符流与编码

字符流(FileReader/FileWriter)底层基于字节流,但内部集成了编码解码逻辑,适合处理文本,避免乱码。

import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo {
    public static void main(String[] args) {
        FileReader fr = null;
        try {
            fr = new FileReader("test.txt");
            char[] buffer = new char[1024];
            int len;
            while ((len = fr.read(buffer)) != -1) {
                System.out.print(new String(buffer, 0, len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fr != null) {
                try { fr.close(); } catch (IOException e) { e.printStackTrace(); }
            }
        }
    }
}

注意:flush() 用于刷新缓冲区,close() 会自动调用 flush()。若系统默认编码与文件不一致,需使用转换流指定编码。

高级 IO 流

缓冲流提升效率

BufferedInputStream 和 BufferedReader 通过内存缓冲区减少磁盘 IO 次数。BufferedReader 的 readLine() 是按行读取文本的标准方式。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
对象序列化

对象流实现对象的持久化存储。类需实现 Serializable 接口,建议定义 serialVersionUID 保证版本一致。

import java.io.Serializable;

class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String username;
    private transient String password; // 不参与序列化
    // 构造函数与 Getter/Setter 省略
}

最佳实践与总结

  1. 资源管理:优先使用 try-with-resources 语法,JDK 7+ 引入,自动关闭流,避免泄漏。
  2. 缓冲区:大文件操作务必使用缓冲流,大小设为 1024 的倍数。
  3. 编码:文本处理尽量指定编码格式,不依赖系统默认值。
  4. 异常处理:捕获 IOException 并妥善处理,保证程序健壮性。

掌握这些要点,就能从容应对绝大多数 Java IO 场景。

目录

  1. Java IO 流概述
  2. 核心概念与分类
  3. 字节流实战
  4. 文件读写基础
  5. 文件拷贝技巧
  6. 字符流与编码
  7. 高级 IO 流
  8. 缓冲流提升效率
  9. 对象序列化
  10. 最佳实践与总结

更多推荐文章

查看全部
  • 基于腾讯云 HAI 与 DeepSeek 快速构建个人网页
  • QGroundControl 跨平台安装指南:Windows、macOS、Linux 与 Android 部署
  • 技术管理者低代码手册:平台分类与价值边界
  • JavaScript WebAPI 实战指南:DOM 操作与事件处理
  • Cursor Agent Skills 实战指南:打造专属前端 AI 助手
  • Java Swing 网格布局 GridLayout 基础用法
  • 基于 Whisper-large-v3 的多语言翻译系统开发
  • Windows 7 编译运行 llama.cpp 部署 Qwen 模型指南
  • PyTorch 实战:文本引导图像生成与 Stable Diffusion 实践
  • Win11 上折腾 Dify 本地 AI Agent 的记录
  • Qwen3-TTS-Tokenizer-12Hz在AR眼镜实时语音交互中的低延迟应用
  • Web 自动化测试入门:核心概念与百度搜索实战
  • Claude Code 本地部署与项目实战详解
  • Better Exceptions 完全指南:Python 调试进阶
  • Linux 高级 IO:I/O 多路转接之 epoll 接口与原理详解
  • Taipy:基于 Python 的数据科学应用开发框架
  • 基于 MCP Tools 构建 Trae Agent 实现 Gitee 自动化管理
  • 大模型领域 10 篇必读论文精选
  • Python 数据科学工具链实战:NumPy、Pandas 与 Matplotlib 入门
  • Java 多线程并发编程:并发容器与线程协作实战

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online