Skip to content

17.1 什么是 IO?

IO 的概念

IO(Input/Output)是指计算机与外部世界之间的数据交换。在 Java 中,IO 操作主要涉及到数据的读取(Input)和写入(Output)。

IO 的分类

在 Java 中,IO 操作可以分为以下几类:

  1. 按流向分

    • 输入流(Input Stream):从外部设备读取数据到程序
    • 输出流(Output Stream):从程序写入数据到外部设备
  2. 按数据单位分

    • 字节流(Byte Stream):以字节为单位进行操作,适用于所有类型的数据
    • 字符流(Character Stream):以字符为单位进行操作,适用于文本数据
  3. 按功能分

    • 节点流(Node Stream):直接与数据源或目标交互的流
    • 处理流(Processing Stream):对节点流进行包装,提供额外功能

Java IO 体系

Java 的 IO 体系主要由以下类组成:

字节流

  • 输入字节流InputStream 及其子类
  • 输出字节流OutputStream 及其子类

字符流

  • 输入字符流Reader 及其子类
  • 输出字符流Writer 及其子类

字节流 vs 字符流

特性字节流字符流
操作单位字节(8位)字符(16位)
适用场景所有类型数据(二进制、文本)文本数据
基类InputStream/OutputStreamReader/Writer
处理编码不处理编码,直接操作字节处理编码,将字节转换为字符

常用的 IO 类

字节流

  • FileInputStream/FileOutputStream:从文件读取/写入字节
  • ByteArrayInputStream/ByteArrayOutputStream:从字节数组读取/写入字节
  • BufferedInputStream/BufferedOutputStream:带缓冲区的字节流

字符流

  • FileReader/FileWriter:从文件读取/写入字符
  • CharArrayReader/CharArrayWriter:从字符数组读取/写入字符
  • BufferedReader/BufferedWriter:带缓冲区的字符流
  • InputStreamReader/OutputStreamWriter:字节流与字符流的转换

IO 操作的基本步骤

  1. 创建流对象:根据需要选择合适的流类
  2. 执行 IO 操作:读取或写入数据
  3. 关闭流:使用完毕后关闭流,释放资源

示例:使用字节流读取文件

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

public class ByteStreamExample {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            // 创建字节输入流
            fis = new FileInputStream("example.txt");
            
            // 读取数据
            int data;
            while ((data = fis.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭流
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

示例:使用字符流读取文件

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

public class CharacterStreamExample {
    public static void main(String[] args) {
        FileReader fr = null;
        try {
            // 创建字符输入流
            fr = new FileReader("example.txt");
            
            // 读取数据
            int data;
            while ((data = fr.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭流
            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

使用 try-with-resources 自动关闭流

Java 7 引入了 try-with-resources 语句,可以自动关闭实现了 AutoCloseable 接口的资源,包括各种 IO 流。

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

public class TryWithResourcesExample {
    public static void main(String[] args) {
        // 使用 try-with-resources 自动关闭流
        try (FileReader fr = new FileReader("example.txt")) {
            int data;
            while ((data = fr.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 流自动关闭,不需要 finally 块
    }
}

总结

IO 是 Java 中处理数据输入输出的重要机制:

  1. IO 的分类

    • 按流向:输入流、输出流
    • 按数据单位:字节流、字符流
    • 按功能:节点流、处理流
  2. IO 体系

    • 字节流:InputStream/OutputStream 及其子类
    • 字符流:Reader/Writer 及其子类
  3. 字节流 vs 字符流

    • 字节流适用于所有类型数据
    • 字符流适用于文本数据,处理编码
  4. IO 操作步骤

    • 创建流对象
    • 执行 IO 操作
    • 关闭流(或使用 try-with-resources 自动关闭)

通过合理使用 IO 流,可以实现各种数据的读取和写入操作,满足不同场景的需求。

© 2026 编程马·菜鸟教程 版权所有