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。 完成后务必关闭流以确保数据被正确写入。
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 格式。
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。 字符串长度首先被写入。
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。 该格式与平台无关。
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 方法返回写入流的字节数。 这对于跟踪输出大小或创建标头非常有用。 计数从零开始,并随着每次写入操作而递增。 它不包括缓冲的未写入数据。
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 应用程序中使用二进制数据输出至关重要。
作者
列出所有Java教程。