Java IO概述 #

一、IO概述 #

Java IO(Input/Output)是Java提供的用于处理输入输出的API。

1.1 IO分类 #

  • 按流向:输入流、输出流
  • 按类型:字节流、字符流
  • 按功能:节点流、处理流

1.2 IO体系 #

text
字节流
├── InputStream(输入)
│   ├── FileInputStream
│   ├── ByteArrayInputStream
│   ├── BufferedInputStream
│   └── DataInputStream
└── OutputStream(输出)
    ├── FileOutputStream
    ├── ByteArrayOutputStream
    ├── BufferedOutputStream
    └── DataOutputStream

字符流
├── Reader(输入)
│   ├── FileReader
│   ├── StringReader
│   ├── BufferedReader
│   └── InputStreamReader
└── Writer(输出)
    ├── FileWriter
    ├── StringWriter
    ├── BufferedWriter
    └── OutputStreamWriter

二、字节流vs字符流 #

2.1 区别 #

特性 字节流 字符流
处理单位 字节(8位) 字符(16位)
基类 InputStream/OutputStream Reader/Writer
适用场景 二进制文件 文本文件
编码 不处理编码 自动处理编码

2.2 选择建议 #

java
// 文本文件:使用字符流
Reader reader = new FileReader("test.txt");
Writer writer = new FileWriter("output.txt");

// 二进制文件:使用字节流
InputStream is = new FileInputStream("image.png");
OutputStream os = new FileOutputStream("copy.png");

三、节点流与处理流 #

3.1 节点流 #

直接操作数据源的流。

java
// 文件节点流
FileInputStream fis = new FileInputStream("test.txt");
FileOutputStream fos = new FileOutputStream("output.txt");

// 数组节点流
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ByteArrayOutputStream baos = new ByteArrayOutputStream();

3.2 处理流 #

包装节点流,提供增强功能。

java
// 缓冲流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"));

// 转换流
InputStreamReader isr = new InputStreamReader(new FileInputStream("test.txt"), "UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8");

四、流的关闭 #

4.1 手动关闭 #

java
FileInputStream fis = null;
try {
    fis = new FileInputStream("test.txt");
    // 读取操作
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4.2 try-with-resources #

java
try (FileInputStream fis = new FileInputStream("test.txt");
     FileOutputStream fos = new FileOutputStream("output.txt")) {
    // 读写操作
} catch (IOException e) {
    e.printStackTrace();
}

五、File类 #

5.1 创建File对象 #

java
File file1 = new File("test.txt");
File file2 = new File("/path/to/file.txt");
File file3 = new File("/path", "file.txt");

5.2 常用方法 #

java
File file = new File("test.txt");

// 文件信息
file.getName();          // 文件名
file.getPath();          // 路径
file.getAbsolutePath();  // 绝对路径
file.getParent();        // 父目录
file.length();           // 文件大小

// 判断
file.exists();           // 是否存在
file.isFile();           // 是否是文件
file.isDirectory();      // 是否是目录
file.canRead();          // 是否可读
file.canWrite();         // 是否可写

// 操作
file.createNewFile();    // 创建文件
file.delete();           // 删除文件
file.mkdir();            // 创建目录
file.mkdirs();           // 创建多级目录
file.renameTo(new File("new.txt"));  // 重命名

// 目录操作
String[] list = file.list();           // 列出文件名
File[] files = file.listFiles();       // 列出File对象

六、IO设计模式 #

6.1 装饰器模式 #

java
// 节点流被处理流装饰
InputStream is = new FileInputStream("test.txt");
InputStream bis = new BufferedInputStream(is);
InputStream dis = new DataInputStream(bis);

6.2 适配器模式 #

java
// 字节流转字符流
InputStream is = new FileInputStream("test.txt");
Reader reader = new InputStreamReader(is, "UTF-8");

七、总结 #

类型 输入 输出
字节流 InputStream OutputStream
字符流 Reader Writer

IO要点:

  • 字节流处理二进制,字符流处理文本
  • 使用处理流增强功能
  • 使用try-with-resources自动关闭
  • File类操作文件和目录
最后更新:2026-03-26