ZetCode

Java DataOutputStream 类

最后修改时间:2025 年 4 月 16 日

java.io.DataOutputStream 类允许以可移植的方式将 Java 原始数据类型写入输出流。它使用与机器无关的格式将数据转换为字节序列。这对于二进制文件 I/O 和网络通信非常有用。

DataOutputStream 实现了 DataOutput 接口。 它包装另一个 OutputStream 并提供用于写入各种数据类型的方法。 所有多字节写入均采用大端顺序。 该类不是线程安全的,不能进行并发访问。

DataOutputStream 类概述

DataOutputStream 继承自 FilterOutputStream 并提供写入原始类型的方法。 主要方法包括针对不同数据类型的写入操作、刷新和关闭流。 size 方法返回迄今为止写入的字节数。

public class DataOutputStream extends FilterOutputStream implements DataOutput {
    public DataOutputStream(OutputStream out);
    public final void writeBoolean(boolean v);
    public final void writeByte(int v);
    public final void writeShort(int v);
    public final void writeChar(int v);
    public final void writeInt(int v);
    public final void writeLong(long v);
    public final void writeFloat(float v);
    public final void writeDouble(double v);
    public final void writeBytes(String s);
    public final void writeChars(String s);
    public final void writeUTF(String str);
    public final int size();
    public void flush();
    public void close();
}

上面的代码显示了 DataOutputStream 提供的关键方法。 这些方法允许以可移植的二进制格式写入 Java 原始类型。 size 方法返回写入的总字节数,这对于跟踪输出非常有用。

创建 DataOutputStream

DataOutputStream 是通过将其包装在另一个 OutputStream 周围来创建的。 常见的包装器包括用于文件的 FileOutputStream 或用于内存的 ByteArrayOutputStream。 完成后务必关闭流以确保数据被正确写入。

Main.java
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        try {
            // Create with FileOutputStream
            FileOutputStream fileStream = new FileOutputStream("data.bin");
            DataOutputStream dataStream = new DataOutputStream(fileStream);
            
            System.out.println("DataOutputStream created");
            
            // Write some data
            dataStream.writeInt(42);
            dataStream.writeUTF("Hello");
            
            System.out.println("Data written to stream");
            
            dataStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例演示了创建一个包装在 FileOutputStream 周围的 DataOutputStream。 我们将一个整数和一个字符串写入文件。 UTF 方法以修改后的 UTF-8 格式写入字符串。 务必关闭流以确保所有数据都刷新到基础输出。

写入原始数据类型

DataOutputStream 为所有 Java 原始类型提供方法。 每种方法都以固定大小的二进制格式写入数据。 整数以大端顺序写入。 浮点数使用 IEEE 754 格式。

Main.java
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        try (ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
             DataOutputStream dataStream = new DataOutputStream(byteStream)) {
            
            // Write various primitive types
            dataStream.writeBoolean(true);
            dataStream.writeByte(65); // 'A'
            dataStream.writeShort(1000);
            dataStream.writeInt(123456);
            dataStream.writeLong(999999999L);
            dataStream.writeFloat(3.14f);
            dataStream.writeDouble(2.71828);
            dataStream.writeChar('X');
            
            System.out.println("Total bytes written: " + dataStream.size());
            System.out.println("Data: " + byteStream.toString());
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例将所有原始类型写入 ByteArrayOutputStream。 size 方法显示写入的总字节数(1+1+2+4+8+4+8+2=30 字节)。 输出显示原始字节,可能无法作为文本读取。 DataOutputStream 确保跨平台的一致二进制表示。

写入字符串

DataOutputStream 提供了三种写入字符串的方法:writeBytes (8-bit)、writeChars (16-bit) 和 writeUTF (修改后的 UTF-8)。 writeUTF 最常用,因为它紧凑且能正确处理 Unicode。 字符串长度首先被写入。

Main.java
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        try (DataOutputStream dos = 
                new DataOutputStream(new FileOutputStream("strings.bin"))) {
            
            // Write string as raw bytes (ASCII only)
            dos.writeBytes("ASCII");
            
            // Write string as sequence of chars (UTF-16)
            dos.writeChars("Unicode");
            
            // Write string in UTF-8 format (most efficient)
            dos.writeUTF("Hello 世界");
            
            System.out.println("Strings written to file");
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例演示了不同的字符串写入方法。 writeBytes 适用于仅 ASCII 的字符串。 writeChars 将每个字符写为 2 个字节。 writeUTF 对于通用文本最有效。 该文件包含二进制数据,而不是可读文本。 使用 DataInputStream 正确地读取数据。

处理二进制文件

DataOutputStream 通常用于创建二进制文件。 它允许以紧凑的格式写入结构化数据。 结合 DataInputStream,它提供可靠的二进制文件 I/O。 该格式与平台无关。

Main.java
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

public class Main {

    public static void main(String[] args) {
        try (DataOutputStream dos = 
                new DataOutputStream(new FileOutputStream("user.dat"))) {
            
            // Write user record
            dos.writeInt(101);          // user ID
            dos.writeUTF("John Doe");   // name
            dos.writeDouble(1250.75);  // balance
            dos.writeLong(new Date().getTime()); // timestamp
            
            System.out.println("Binary user record written");
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例将结构化的二进制记录写入文件。 该记录包含按特定顺序排列的不同数据类型。 与文本格式相比,该格式紧凑且高效。 要读取文件,请使用带有匹配读取方法的 DataInputStream。 读取操作的顺序必须与写入顺序匹配。

测量输出大小

size 方法返回写入流的字节数。 这对于跟踪输出大小或创建标头非常有用。 计数从零开始,并随着每次写入操作而递增。 它不包括缓冲的未写入数据。

Main.java
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        try (ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
             DataOutputStream dataStream = new DataOutputStream(byteStream)) {
            
            System.out.println("Initial size: " + dataStream.size());
            
            dataStream.writeInt(42);
            System.out.println("After int: " + dataStream.size());
            
            dataStream.writeDouble(3.14159);
            System.out.println("After double: " + dataStream.size());
            
            dataStream.writeUTF("Measurement");
            System.out.println("After string: " + dataStream.size());
            
            System.out.println("Final size: " + dataStream.size());
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例演示了使用 size 方法跟踪输出大小。 每次写入操作都会将计数增加写入数据的大小(int=4,double=8)。 字符串大小包括 2 个字节的长度加上 UTF-8 字节。 size 反映写入的数据,不一定是刷新的数据。

来源

Java DataOutputStream 类文档

在本文中,我们介绍了 Java DataOutputStream 类的基本方法和功能。 了解这些概念对于在 Java 应用程序中使用二进制数据输出至关重要。

作者

我的名字是 Jan Bodnar,我是一位敬业的程序员,在该领域拥有多年的经验。 我于 2007 年开始撰写编程文章,至今已撰写了 1,400 多篇文章和八本电子书。 凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程