《Java中的IO流》

目录

引言

一、IO流概述

​编辑

二、字节流体系

三、字符流体系

[1. 常用字符流类](#1. 常用字符流类)

[2. 文本文件读写示例](#2. 文本文件读写示例)

[3. 编码问题处理](#3. 编码问题处理)

四、转换流

五、对象流与序列化

[1. 序列化与反序列化](#1. 序列化与反序列化)


引言

IO(Input/Output)流是Java中处理输入输出的核心机制,无论是文件读写、网络通信还是内存操作,都离不开IO流。本文将全面介绍Java IO流体系,帮助你掌握这一重要技术。

一、IO流概述

IO流是Java中用于处理输入输出操作的抽象概念,可以想象成数据的"管道":

输入流:从数据源(如文件、网络等)读取数据到程序

输出流:将程序中的数据写入到目的地

Java IO流的主要分类:

按数据单位分:

字节流:以字节(8bit)为单位(适合所有类型数据)

字符流:以字符为单位(适合文本数据)

按流向分:

输入流:读取数据,

输出流:写入数据

按角色分:

节点流:直接操作数据源/目的地。

处理流:对现有流进行包装增强

二、字节流体系

字节流是Java IO的基础,所有InputStreamOutputStream的子类都是字节流。

  1. 常用字节流类
类名 描述
InputStream 所有字节输入流的父类(抽象类)
OutputStream 所有字节输出流的父类(抽象类)
FileInputStream 文件字节输入流
FileOutputStream 文件字节输出流
ByteArrayInputStream 字节数组输入流
ByteArrayOutputStream 字节数组输出流
BufferedInputStream 缓冲字节输入流
BufferedOutputStream 缓冲字节输出流
  1. 文件读写示例
java 复制代码
// 文件复制示例(字节流)
public static void copyFile(String src, String dest) throws IOException {
    try (InputStream in = new FileInputStream(src);
         OutputStream out = new FileOutputStream(dest)) {
        byte[] buffer = new byte[1024];
        int len;
        while ((len = in.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
    }
}
  1. 缓冲流的使用

缓冲流可以显著提高IO效率:

java 复制代码
// 使用缓冲流提高效率
public static void bufferedCopy(String src, String dest) throws IOException {
    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest))) {
        byte[] buffer = new byte[1024];
        int len;
        while ((len = bis.read(buffer)) != -1) {
            bos.write(buffer, 0, len);
        }
    }
}

三、字符流体系

字符流专门用于处理文本数据,底层实际还是字节流+编码转换。

1. 常用字符流类

类名 描述
Reader 所有字符输入流的父类
Writer 所有字符输出流的父类
FileReader 文件字符输入流
FileWriter 文件字符输出流
CharArrayReader 字符数组输入流
CharArrayWriter 字符数组输出流
BufferedReader 缓冲字符输入流
BufferedWriter 缓冲字符输出流
InputStreamReader 字节流转字符流
OutputStreamWriter 字符流转字节流

2. 文本文件读写示例

java 复制代码
// 文本文件读取(字符流)
public static String readTextFile(String filename) throws IOException {
    StringBuilder content = new StringBuilder();
    try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
        String line;
        while ((line = reader.readLine()) != null) {
            content.append(line).append("\n");
        }
    }
    return content.toString();
}

// 文本文件写入(字符流)
public static void writeTextFile(String filename, String content) throws IOException {
    try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) {
        writer.write(content);
    }
}

3. 编码问题处理

java 复制代码
// 指定编码读写文件
public static void readWithEncoding(String filename, String charset) throws IOException {
    try (InputStreamReader isr = new InputStreamReader(
            new FileInputStream(filename), charset);
         BufferedReader br = new BufferedReader(isr)) {
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }
}

四、转换流

转换流是字节流和字符流之间的桥梁:

InputStreamReader:将字节输入流转换为字符输入流

OutputStreamWriter:将字符输出流转换为字节输出流

java 复制代码
// 转换流示例
public static void convertStreamDemo() throws IOException {
    // 字节流 -> 字符流
    InputStream is = new FileInputStream("test.txt");
    Reader reader = new InputStreamReader(is, "UTF-8");
    
    // 字符流 -> 字节流
    OutputStream os = new FileOutputStream("output.txt");
    Writer writer = new OutputStreamWriter(os, "GBK");
}

五、对象流与序列化

Java提供了对象序列化机制,可以将对象转换为字节流进行存储或传输。

1. 序列化与反序列化

java 复制代码
// 需要序列化的类必须实现Serializable接口
class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    // 构造方法、getter/setter省略
}

// 对象序列化
public static void serializeObject(Object obj, String filename) throws IOException {
    try (ObjectOutputStream oos = new ObjectOutputStream(
            new FileOutputStream(filename))) {
        oos.writeObject(obj);
    }
}

// 对象反序列化
public static Object deserializeObject(String filename) 
        throws IOException, ClassNotFoundException {
    try (ObjectInputStream ois = new ObjectInputStream(
            new FileInputStream(filename))) {
        return ois.readObject();
    }
}

Java IO流体系庞大但层次清晰,掌握其核心原理和常用类后,各种IO需求都能应对自如。随着Java版本更新,也出现了更多简化IO操作的API,但底层原理仍是IO流体系。

相关推荐
鱼鳞_33 分钟前
苍穹外卖-Day07(缓存菜品)
java·缓存
richard_yuu35 分钟前
C#零基础通关第六篇:吃透静态、常量与只读,分清静态与实例的本质差异
开发语言·c#
拂拉氏2 小时前
【项目分享-知识讲解】C++标准库string类的模拟实现+KMP算法讲解+哈希思想了解
开发语言·c++·算法·kmp算法·哈希·string类
枫叶丹42 小时前
【HarmonyOS 6.0】Graphics Accelerate Kit:AI超帧能力技术解析与实践
开发语言·人工智能·华为·harmonyos
HelloAldis2 小时前
Java 库 univer-lib:让 Univer Sheets 与 xlsx 无损双向转换
java·开发语言·xlsx·univer
枕星而眠2 小时前
C++ 类与对象核心知识点及面试高频题详解
开发语言·c++·面试
2501_930707787 小时前
使用C#代码在 PowerPoint 中组合或取消组合形状
开发语言·c#
晚烛8 小时前
CANN 调试工具与性能剖析:从日志分析到 NPU 行为追踪的完整调试体系
开发语言·windows·python·深度学习·缓存
惊鸿一博8 小时前
图标加载方式_zeroIcon_是否加前缀mdi
开发语言·前端·javascript
王八八。8 小时前
linux后台java、postSQL部署命令
java·linux·运维