InputStream
和 OutputStream
是 Java I/O 库中的两个核心抽象类,它们分别用于表示字节数据的输入和输出流。这两个类本身不能直接实例化,但你可以通过它们的子类来创建具体的输入或输出流对象。下面将详细介绍 InputStream
和 OutputStream
的基本用法。
InputStream 的用法
InputStream
是所有输入字节流的超类。它定义了一个基本的 read()
方法来读取数据,该方法可以从输入流中读取数据的下一个字节。
常用方法
int read()
:从输入流中读取下一个数据字节。如果到达文件末尾,则返回-1
。int read(byte[] b)
:从输入流中读取一些字节数,并将它们存储到字节数组b
中。返回实际读取的字节数,如果到达文件末尾,则返回-1
。int read(byte[] b, int off, int len)
:从输入流中读取最多len
个字节的数据到一个字节数组中。off
指定了数组开始填充数据的偏移量。返回实际读取的字节数,如果到达文件末尾,则返回-1
。void close()
:关闭此输入流并释放与该流关联的所有系统资源。
示例代码
try (InputStream inputStream = new FileInputStream("example.txt")) { | |
int data = inputStream.read(); | |
while (data != -1) { | |
// 处理读取到的数据 | |
System.out.print((char) data); // 假设是文本文件,这里简单地将字节转换为字符 | |
data = inputStream.read(); | |
} | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} |
OutputStream 的用法
OutputStream
是所有输出字节流的超类。它定义了一个基本的 write()
方法来写入数据,该方法将指定的字节写入此输出流。
常用方法
void write(int b)
:将指定的字节写入此输出流。void write(byte[] b)
:将b.length
个字节从指定的字节数组写入此输出流。void write(byte[] b, int off, int len)
:从指定的字节数组写入len
个字节到输出流中,从偏移量off
处开始。void flush()
:刷新此输出流并强制写出所有缓冲的输出字节。void close()
:关闭此输出流并释放与此流关联的所有系统资源。
示例代码
try (OutputStream outputStream = new FileOutputStream("example.txt", true)) { // true 表示追加模式 | |
String text = "Hello, OutputStream!"; | |
byte[] textAsBytes = text.getBytes(); | |
outputStream.write(textAsBytes); | |
outputStream.flush(); // 通常情况下,close() 方法调用时会自动调用 flush(),但显式调用 flush() 可以在关闭流之前确保所有数据都被写出 | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} |
注意事项
- 在使用完流后,应该关闭流以释放系统资源。可以使用
try-with-resources
语句来自动管理资源,如上例所示。 - 读写操作可能会抛出
IOException
,因此需要进行异常处理。 flush()
方法用于确保所有缓冲的输出数据都被实际写出到底层输出流中。虽然close()
方法会调用flush()
,但在某些情况下,你可能希望在关闭流之前显式调用flush()
。OutputStream
和InputStream
的子类(如FileOutputStream
和FileInputStream
)提供了更具体的文件操作功能。