408. Java 文件操作基础 - 处理原始类型的流
·
文章目录
408. Java 文件操作基础 - 处理原始类型的流
在前面学习了字节流和字符流的基础上,Java 还提供了 DataInputStream 和 DataOutputStream 来方便地读取和写入 原始类型数据(int、long、float 等)。
1️⃣ DataOutputStream:写入原始类型
DataOutputStream 是 OutputStream 的装饰器,它提供方法将 Java 的原始类型直接写入二进制流中。
常用方法:
| 方法 | 说明 |
|---|---|
writeByte(int) |
写入最低 8 位,忽略高 24 位 |
writeBoolean(boolean) |
写入布尔值 |
writeChar(char) |
写入字符 |
writeShort(short) |
写入短整型 |
writeInt(int) |
写入整型(4 字节) |
writeLong(long) |
写入长整型(8 字节) |
writeFloat(float) |
写入浮点数 |
writeDouble(double) |
写入双精度浮点数 |
writeBytes(String) |
按低 8 位写字符串 |
writeChars(String) |
写字符数组 |
writeUTF(String) |
写 UTF-8 编码字符串 |
🔹 示例:写入整数数组
import java.nio.file.*;
import java.io.*;
import java.util.Arrays;
public class DataOutputExample {
public static void main(String[] args) throws IOException {
int[] ints = {3, 1, 4, 1, 5, 9};
Path path = Paths.get("files/ints.bin");
try (OutputStream outputStream = Files.newOutputStream(path);
DataOutputStream dataOutputStream = new DataOutputStream(outputStream)) {
for (int i : ints) {
dataOutputStream.writeInt(i);
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.printf("Wrote %d ints to %s [%d bytes]\n",
ints.length, path, Files.size(path));
}
}
✅ 讲解:
- 每个
int占用 4 个字节 → 6 个整数就是 24 字节 - 输出文件是纯二进制文件,不能直接用文本编辑器查看
- 装饰器模式:
DataOutputStream装饰OutputStream
2️⃣ DataInputStream:读取原始类型
DataInputStream 是 InputStream 的装饰器,用于从二进制流读取原始类型数据。
常用方法:
| 方法 | 说明 |
|---|---|
readBoolean() |
读取布尔值 |
readByte() / readUnsignedByte() |
读取字节或无符号字节 |
readChar() |
读取字符 |
readShort() / readUnsignedShort() |
读取短整型 / 无符号短整型 |
readInt() |
读取整型 |
readLong() |
读取长整型 |
readFloat() |
读取浮点数 |
readDouble() |
读取双精度浮点数 |
readUTF() |
读取 UTF-8 编码字符串 |
readFully(byte[]) |
读取到数组,直到填满 |
readFully(byte[], offset, length) |
从偏移位置读取指定长度 |
🔹 示例:读取整数数组
import java.nio.file.*;
import java.io.*;
import java.util.Arrays;
public class DataInputExample {
public static void main(String[] args) throws IOException {
Path path = Path.of("files/ints.bin");
int[] ints1 = new int[6];
try (InputStream inputStream = Files.newInputStream(path);
DataInputStream dataInputStream = new DataInputStream(inputStream)) {
for (int i = 0; i < ints1.length; i++) {
ints1[i] = dataInputStream.readInt();
}
System.out.println("ints = " + Arrays.toString(ints1));
}
}
}
✅ 讲解:
DataInputStream装饰InputStream- 每次
readInt()读取 4 个字节 并转换为整数 - 文件必须按照相同顺序写入和读取,否则数据会错乱
- 结合
try-with-resources,流会自动关闭
3️⃣ 小结
- 装饰器模式在原始类型流中也应用
DataOutputStream→ 写原始类型DataInputStream→ 读原始类型
- 适合场景:
- 保存二进制数据(配置、游戏存档、网络协议)
- 不适合直接查看或修改文本内容
- 注意事项:
- 写入顺序必须与读取顺序一致
- 每种原始类型占用固定字节数,保证可预测文件大小
- 支持 UTF-8、布尔值和字符数组等多种数据类型
更多推荐
所有评论(0)