Java OutputStream 类
最后修改时间:2025 年 4 月 16 日
java.io.OutputStream
类是一个抽象超类,代表一个字节的输出流。它提供了将数据写入各种输出目标所需的基本方法。所有输出流类都继承自这个基类。
OutputStream
定义了字节输出操作的基本接口。具体子类为特定的目标(如文件、网络连接或内存缓冲区)实现这些方法。该类是 Java 核心 I/O 系统的一部分。
OutputStream 类概述
OutputStream
是一个抽象类,不能直接实例化。它为 Java 中的所有字节输出操作提供了模板。关键方法包括写入字节、刷新缓冲区和关闭流。
public abstract class OutputStream implements Closeable, Flushable { public abstract void write(int b) throws IOException; public void write(byte[] b) throws IOException; public void write(byte[] b, int off, int len) throws IOException; public void flush() throws IOException; public void close() throws IOException; }
上面的代码显示了 OutputStream
提供的关键方法。这些方法必须由具体的子类实现。该类实现了 Closeable
和 Flushable
接口,用于资源管理。
写入单个字节
最基本的操作是将单个字节写入输出流。write(int b)
方法写入整数参数的最低 8 位。高位被忽略。这是一个抽象方法,子类必须实现。
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class Main { public static void main(String[] args) { try (OutputStream os = new FileOutputStream("output.txt")) { // Write individual bytes os.write(72); // H os.write(101); // e os.write(108); // l os.write(108); // l os.write(111); // o System.out.println("Bytes written successfully"); } catch (IOException e) { e.printStackTrace(); } } }
此示例演示了将单个字节写入文件。try-with-resources 语句确保流被正确关闭。每个 write
调用将一个字节输出到流。这些字节代表“Hello”的 ASCII 字符。
写入字节数组
为了获得更好的性能,您可以使用字节数组一次写入多个字节。write(byte[] b)
方法写入数组中的所有字节。还有一个版本写入数组的一部分。
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class Main { public static void main(String[] args) { try (OutputStream os = new FileOutputStream("output.txt")) { // Create byte array byte[] data = "Hello, OutputStream!".getBytes(); // Write entire array os.write(data); // Write portion of array byte[] largeData = new byte[100]; System.arraycopy(data, 0, largeData, 0, data.length); os.write(largeData, 0, data.length); System.out.println("Byte arrays written successfully"); } catch (IOException e) { e.printStackTrace(); } } }
此示例显示了两种写入字节数组的方式。首先,写入整个数组。然后,写入较大数组的一部分。 System.arraycopy
方法用于将数据复制到较大的数组中。这种方法比写入单个字节更有效。
刷新输出流
flush
方法强制将任何缓冲的输出字节写出。一些输出流为了提高性能而实现缓冲。刷新确保数据实际上被写入目标,而不是停留在缓冲区中。
import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class Main { public static void main(String[] args) { try (OutputStream os = new BufferedOutputStream( new FileOutputStream("output.txt"))) { os.write("Important data".getBytes()); // Force write to disk os.flush(); System.out.println("Data written and flushed"); // More writes os.write("More data".getBytes()); } catch (IOException e) { e.printStackTrace(); } } }
此示例演示了刷新缓冲的输出流。 flush
调用确保数据立即写入磁盘。如果不刷新,数据可能会保留在内存缓冲区中,直到流关闭或缓冲区已满。刷新对于关键数据很重要。
关闭输出流
close
方法释放与流关联的系统资源。关闭流以防止资源泄漏至关重要。try-with-resources 语句在块退出时自动关闭流。
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class Main { public static void main(String[] args) { OutputStream os = null; try { os = new FileOutputStream("output.txt"); os.write("Test data".getBytes()); System.out.println("Data written successfully"); } catch (IOException e) { e.printStackTrace(); } finally { if (os != null) { try { os.close(); System.out.println("Stream closed"); } catch (IOException e) { e.printStackTrace(); } } } } }
此示例显示了在 finally 块中手动关闭流。流是在 try-with-resources 之外创建的,以演示正确的手动关闭。实际上,try-with-resources 是首选。关闭流会自动刷新任何缓冲的数据。
将 OutputStream 与缓冲结合使用
为了获得更好的性能,OutputStream
经常与 BufferedOutputStream
一起使用。这通过在内存中缓冲数据来减少物理写操作的数量。当缓冲区已满或流关闭时,缓冲区会自动刷新。
import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class Main { public static void main(String[] args) { try (OutputStream os = new BufferedOutputStream( new FileOutputStream("largefile.dat"), 8192)) { // Write 1MB of data byte[] data = new byte[1024]; // 1KB buffer for (int i = 0; i < 1024; i++) { // 1024 * 1KB = 1MB os.write(data); } System.out.println("1MB of data written with buffering"); } catch (IOException e) { e.printStackTrace(); } } }
此示例演示了使用缓冲写入大量数据。 BufferedOutputStream
使用 8KB 缓冲区(默认值为 8KB,但我们明确设置了它)。使用缓冲写入许多小块更有效。可以根据性能要求调整缓冲区大小。
来源
在本文中,我们介绍了 Java OutputStream 类的基本方法和特性。理解这些概念对于在 Java 应用程序中处理输出操作至关重要。
作者
列出所有Java教程。