流的基本概念
流
在计算机科学中,流(Stream)是一种抽象的数据传输方式,它代表了一个连续的数据序列。在不同的上下文中,流可以有不同的含义和实现,但基本概念是相似的。以下是流的一些基本概念:
1. 数据流
数据流可以是输入流(Input Stream)或输出流(Output Stream):
- 输入流:从数据源读取数据。
- 输出流:向数据目标写入数据。
2. 字节流和字符流
Java I/O 库中的流分为两种:
- 字节流:处理原始二进制数据,使用
InputStream
和OutputStream
类。 - 字符流:处理字符数据,使用
Reader
和Writer
类。
3. 节点流和处理流
- 节点流(Low-Level Streams):直接从数据源读取或写入数据,如
FileInputStream
和FileOutputStream
。 - 处理流(High-Level Streams):在节点流的基础上提供了额外的功能,如缓冲区、转换等,如
BufferedInputStream
和BufferedReader
。
4. 装饰者模式
许多 Java 流类使用装饰者模式(Decorator Pattern),允许在不修改现有代码的情况下给对象添加新的功能。例如,BufferedInputStream
可以给任何 InputStream
对象添加缓冲功能。
5. 自动资源管理
Java 7 引入了 try-with-resources
语句,确保每个资源在语句结束时自动关闭,从而简化了资源管理。
6. 流的关闭
始终需要关闭流以释放系统资源。可以通过 close()
方法关闭流。
7. 异常处理
流操作可能会抛出 I/O 异常(IOExceptions),通常需要捕获和处理这些异常。
8. Java NIO(New I/O)
Java NIO 是 Java I/O 库的一个扩展,提供了更高级的 I/O 功能,如文件锁定、内存映射文件等。它还引入了通道(Channel)和缓冲区(Buffer)的概念。
示例用法
以下是使用 Java I/O 流的一个简单示例:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class StreamExample {
public static void main(String[] args) {
String filePath = "example.txt";
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个示例中,我们使用了 BufferedReader
和 FileReader
来读取文件。使用 try-with-resources
语句确保 reader
在使用后被自动关闭。
流是 I/O 编程的基础概念,它们提供了一种灵活的方式来处理数据的输入和输出。