Java ByteArrayOutputStream 类
最后修改时间:2025 年 4 月 16 日
java.io.ByteArrayOutputStream
类实现了一个输出流,它将数据写入一个字节数组。缓冲区在写入数据时会自动增长。当你需要在将数据写入其他地方之前在内存中收集数据时,这个类很有用。
ByteArrayOutputStream
扩展了 OutputStream
,并提供了将数据写入内部字节数组的方法。该类包括将缓冲区转换为字节数组或字符串的方法。不需要关闭此流,因为它不使用系统资源。
ByteArrayOutputStream 类概述
ByteArrayOutputStream
维护一个内部字节数组,该数组根据需要增长。关键方法包括写入操作、大小跟踪和缓冲区转换。该类是线程安全的,可以并发访问。
public class ByteArrayOutputStream extends OutputStream { public ByteArrayOutputStream(); public ByteArrayOutputStream(int size); public synchronized void write(int b); public synchronized void write(byte[] b, int off, int len); public synchronized void writeTo(OutputStream out); public synchronized void reset(); public synchronized byte[] toByteArray(); public synchronized int size(); public synchronized String toString(); public synchronized String toString(String charsetName); public void close(); }
上面的代码显示了 ByteArrayOutputStream
提供的关键方法。这些方法允许将数据写入内存缓冲区并将其转换为各种格式。close 方法无效,因为没有使用系统资源。
创建 ByteArrayOutputStream
ByteArrayOutputStream 可以使用默认大小(32 字节)或自定义初始容量创建。缓冲区在需要时会自动增长。指定初始大小可以提高已知数据大小的性能。
import java.io.ByteArrayOutputStream; public class Main { public static void main(String[] args) { // Create with default buffer size ByteArrayOutputStream baos1 = new ByteArrayOutputStream(); System.out.println("Default size: " + baos1.size()); // Create with custom initial size (1024 bytes) ByteArrayOutputStream baos2 = new ByteArrayOutputStream(1024); System.out.println("Custom size: " + baos2.size()); // Write some data to show buffer growth for (int i = 0; i < 100; i++) { baos1.write(i); } System.out.println("After writing 100 bytes: " + baos1.size()); } }
此示例演示了创建 ByteArrayOutputStream 的不同方式。第一个使用默认大小,而第二个指定了 1024 字节。当写入的数据超过初始容量时,缓冲区会自动增长。size 方法返回当前缓冲区内容长度。
将数据写入 ByteArrayOutputStream
ByteArrayOutputStream 提供了几种写入数据的方法。您可以写入单个字节或字节数组。所有写入操作都为了线程安全而同步。缓冲区会自动扩展以容纳写入的数据。
import java.io.ByteArrayOutputStream; import java.io.IOException; public class Main { public static void main(String[] args) { try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { // Write single byte baos.write(65); // ASCII 'A' // Write byte array byte[] data = {66, 67, 68}; // B, C, D baos.write(data); // Write portion of byte array byte[] moreData = {69, 70, 71, 72, 73}; // E, F, G, H, I baos.write(moreData, 1, 3); // Write F, G, H System.out.println("Buffer content: " + baos.toString()); System.out.println("Buffer size: " + baos.size()); } } }
此示例显示了将数据写入 ByteArrayOutputStream 的不同方式。write 方法接受单个字节或字节数组。您还可以使用偏移量和长度参数写入数组的一部分。toString 方法使用平台默认字符集将缓冲区内容转换为字符串。
将缓冲区转换为字节数组
toByteArray 方法返回缓冲区当前内容的一个副本。当您需要将收集的数据作为字节数组访问时,这很有用。原始缓冲区保持不变,并且可以继续累积数据。
import java.io.ByteArrayOutputStream; import java.util.Arrays; public class Main { public static void main(String[] args) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); // Write some data String text = "Hello, ByteArrayOutputStream!"; baos.writeBytes(text.getBytes()); // Get buffer content as byte array byte[] byteArray = baos.toByteArray(); System.out.println("Byte array content: " + Arrays.toString(byteArray)); System.out.println("Byte array length: " + byteArray.length); System.out.println("Original buffer size: " + baos.size()); // Continue writing to original stream baos.writeBytes(" Additional data".getBytes()); System.out.println("Updated buffer size: " + baos.size()); } }
此示例演示了将缓冲区内容转换为字节数组。toByteArray 方法创建一个包含当前内容的新数组。原始流保持活动状态,可以进行进一步的写入。当您需要同时累积数据和处理快照时,这很有用。
将缓冲区内容写入另一个流
writeTo 方法将整个缓冲区内容写入另一个 OutputStream。这对于传输收集的数据非常有效,而无需创建中间字节数组。该方法为了线程安全而同步。
import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; public class Main { public static void main(String[] args) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); // Collect data in memory String data = "This data will be written to a file"; baos.writeBytes(data.getBytes()); try (FileOutputStream fos = new FileOutputStream("output.txt")) { // Write buffer content to file baos.writeTo(fos); System.out.println("Data written to file successfully"); } catch (IOException e) { e.printStackTrace(); } System.out.println("Buffer size after writeTo: " + baos.size()); } }
此示例显示了如何将缓冲区内容传输到另一个输出流。writeTo 方法有效地将所有收集的数据写入目标流。原始缓冲区在操作完成后保持不变。这对于在将数据写入文件或网络流之前在内存中收集数据很有用。
重置缓冲区
reset 方法清除缓冲区内容,将大小重置为零,同时保持相同的底层缓冲区容量。当你需要重用缓冲区时,这比创建一个新流更有效。
import java.io.ByteArrayOutputStream; public class Main { public static void main(String[] args) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); // Write initial data baos.writeBytes("Initial data".getBytes()); System.out.println("After first write: " + baos.toString()); System.out.println("Size: " + baos.size()); // Reset the buffer baos.reset(); System.out.println("After reset: " + baos.toString()); System.out.println("Size: " + baos.size()); // Write new data baos.writeBytes("New data".getBytes()); System.out.println("After second write: " + baos.toString()); System.out.println("Size: " + baos.size()); } }
此示例演示了使用 reset 方法清除缓冲区内容。重置后,缓冲区显示为空,但保留其容量。当你需要将流用于新数据而无需分配新内存时,这很有用。reset 不会缩小底层字节数组。
将缓冲区转换为字符串
ByteArrayOutputStream 提供了 toString 方法,用于将缓冲区内容转换为字符串。您可以使用平台默认字符集或指定一个字符集。当在内存中收集文本数据时,这很有用。
import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; public class Main { public static void main(String[] args) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); // Write data in different encodings try { baos.write("Hello ".getBytes("UTF-8")); baos.write("世界".getBytes("UTF-8")); // Convert to string using default charset System.out.println("Default charset: " + baos.toString()); // Convert using specific charset System.out.println("UTF-8: " + baos.toString("UTF-8")); System.out.println("ISO-8859-1: " + baos.toString("ISO-8859-1")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }
此示例显示了将缓冲区内容转换为字符串的不同方式。没有参数的 toString 方法使用平台默认字符集。指定字符集可确保一致的字符编码。请注意,某些字符集可能不支持缓冲区中的所有字符。
来源
Java ByteArrayOutputStream 类文档
在本文中,我们涵盖了 Java ByteArrayOutputStream 类的基本方法和特性。理解这些概念对于在 Java 应用程序中使用内存中的字节数据收集和操作至关重要。
作者
列出所有Java教程。