引言
在Java编程中,处理输入输出是日常任务的一部分,而流(Stream)是实现输入输出的核心概念。在Java I/O API中,InputStream
和OutputStream
是所有字节流类的基础。本文将详细介绍这两个类及其在Java中的应用。
什么是InputStream和OutputStream?
InputStream 是Java I/O库中的一个抽象类,它是表示字节输入流的所有类的超类。它用于从源(如文件、数组、字符串、网络连接等)读取字节数据。
OutputStream 同样是一个抽象类,代表字节输出流的所有类的超类。它用于将字节数据写入目的地。
InputStream的常用方法
int read()
: 读取单个字节的数据。如果没有输入可用,此方法将阻塞。int read(byte[] b)
: 读取一些字节并将它们存储到缓冲区数组b
中。int read(byte[] b, int off, int len)
: 从输入流中读取最多len
个字节的数据到一个字节数组。void close()
: 关闭输入流并释放与该流相关联的所有系统资源。
OutputStream的常用方法
void write(int b)
: 将指定的字节写入此输出流。void write(byte[] b)
: 将b.length
字节从指定的字节数组写入此输出流。void write(byte[] b, int off, int len)
: 将指定字节数组中从偏移量off
开始的len
个字节写入此输出流。void flush()
: 刷新此输出流并强制写出所有缓冲的输出字节。void close()
: 关闭此输出流并释放与此流相关联的任何系统资源。
使用InputStream和OutputStream
以下是如何使用InputStream和OutputStream进行文件读写的示例代码。
读取文件示例:
try (InputStream is = new FileInputStream("example.txt")) {
int byteRead;
while ((byteRead = is.read()) != -1) {
// 处理字节数据
System.out.print((char) byteRead);
}
} catch (IOException e) {
e.printStackTrace();
}
写入文件示例:
try (OutputStream os = new FileOutputStream("example.txt")) {
String data = "Hello, World!";
byte[] dataBytes = data.getBytes();
os.write(dataBytes);
} catch (IOException e) {
e.printStackTrace();
}
InputStream和OutputStream的子类
Java I/O API提供了多个实现了这两个抽象类的具体类,例如:
FileInputStream
和FileOutputStream
:用于文件读写。ByteArrayInputStream
和ByteArrayOutputStream
:用于内存数组读写。BufferedInputStream
和BufferedOutputStream
:用于缓冲输入输出,增加效率。DataInputStream
和DataOutputStream
:可以读取和写入Java原始数据类型。ObjectInputStream
和ObjectOutputStream
:可以读取和写入对象。
总结
InputStream
和OutputStream
在Java世界中是处理字节流数据的基石。它们提供了一个强大的框架,用于从各种数据源读取和写入数据。通过使用它们的不同实现,我们可以很容易地处理来自文件、网络或内存的数据。理解这些类及其方法对于任何需要进行I/O操作的Java开发者来说都是至关重要的。
注意事项
在使用InputStream
和OutputStream
时,一定要记得关闭流。这可以通过close()
方法实现,或者更好的方式是使用try-with-resources语句,它会自动关闭实现了AutoCloseable
接口的资源。不正确地关闭流可能会导致资源泄露和其他性能问题。