408. Java 文件操作基础 - 处理原始类型的流

在前面学习了字节流和字符流的基础上,Java 还提供了 DataInputStreamDataOutputStream 来方便地读取和写入 原始类型数据intlongfloat 等)。


1️⃣ DataOutputStream:写入原始类型

DataOutputStreamOutputStream 的装饰器,它提供方法将 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:读取原始类型

DataInputStreamInputStream 的装饰器,用于从二进制流读取原始类型数据。

常用方法:

方法 说明
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、布尔值和字符数组等多种数据类型

更多推荐