409. Java 文件操作基础 - 内存中的 I/O 流
在 Java I/O 中,我们不仅可以操作文件,还可以操作 内存中的数据结构,比如 字符数组、字节数组或字符串。这种技术在某些场景下非常有用,例如:
-
文件格式处理:
JPEG、ZIP等格式可能需要在文件开头写入某个字段长度,但长度在写入前无法计算。 - 压缩数据:计算原始数据大小很简单,但计算压缩后数据的大小可能很复杂。可以先写入内存流,然后得到实际字节数。
- 测试和缓存:不依赖文件系统,直接在内存操作数据,速度更快。
1️⃣ 操作字符数组:CharArrayReader 和 CharArrayWriter
Java 提供了两类内存字符流:
| 类名 | 作用 |
|---|---|
CharArrayReader |
从 char[] 数组中读取字符(继承自 Reader) |
CharArrayWriter |
将字符写入 char[] 数组(继承自 Writer) |
⚠️ 它们只是对
Reader和Writer的装饰,不添加新方法,只是提供 内存操作的介质。
🔹 示例:写入字符到内存流
import java.io.*;
public class CharArrayWriterExample {
public static void main(String[] args) throws IOException {
CharArrayWriter writer = new CharArrayWriter();
writer.write("Hello, In-Memory IO!");
writer.write('\n');
writer.write("Java I/O is flexible.");
// 将内存中的字符数组转换为字符串
String result = writer.toString();
System.out.println("Written content:\n" + result);
// 获取内存中的字符数组
char[] chars = writer.toCharArray();
System.out.println("Number of chars written: " + chars.length);
writer.close();
}
}
✅ 讲解:
-
CharArrayWriter类似文件流,但内容在内存中 -
.toString()可以快速获取字符串 -
.toCharArray()可以获取底层数组,方便处理
🔹 示例:从字符数组中读取数据
import java.io.*;
public class CharArrayReaderExample {
public static void main(String[] args) throws IOException {
char[] data = "Read me from memory!".toCharArray();
CharArrayReader reader = new CharArrayReader(data);
int c;
while ((c = reader.read()) != -1) {
System.out.print((char)c);
}
System.out.println();
reader.close();
}
}
✅ 讲解:
-
CharArrayReader从内存数组中读取字符 - 使用
read()方法逐个读取字符 - 结束时返回
-1
2️⃣ 使用场景总结
- 临时数据处理:不需要文件存储,减少 I/O 开销
- 压缩和格式化:先写到内存,处理完再写入磁盘或网络
- 测试:方便单元测试,不依赖文件系统
- 与
BufferedReader、BufferedWriter等其他流组合,可提升效率