流的分类
流的分类
在Java中,流(Stream)被用于表示数据的输入和输出。Java的流分为几个不同的类别,每种类别都有其特定的用途和特点。以下是Java流的主要分类:
1. 字节流(Byte Streams)
- 处理原始字节数据。
- 代表类:
InputStream
和OutputStream
。
2. 字符流(Character Streams)
- 处理字符数据,自动处理字符编码的转换。
- 代表类:
Reader
和Writer
。
3. 输入流(Input Streams)
- 用于从数据源读取数据。
- 字节输入流:
FileInputStream
,ByteArrayInputStream
,StringBufferInputStream
。 - 字符输入流:
FileReader
,CharArrayReader
,StringReader
。
4. 输出流(Output Streams)
- 用于向数据目标写入数据。
- 字节输出流:
FileOutputStream
,ByteArrayOutputStream
,PrintStream
。 - 字符输出流:
FileWriter
,CharArrayWriter
,StringWriter
。
5. 节点流(Low-Level Streams)
- 直接连接到数据源或数据目的地的基本流。
- 例如:
FileInputStream
,FileOutputStream
,FileReader
,FileWriter
。
6. 处理流(High-Level Streams)
- 在节点流的基础上提供额外的功能,如缓冲、过滤、数据转换等。
- 字节处理流:
BufferedInputStream
,BufferedOutputStream
,DataInputStream
,FilterInputStream
。 - 字符处理流:
BufferedReader
,BufferedWriter
,LineNumberReader
,FilterReader
。
7. 管道流(Pipe Streams)
- 用于线程之间的通信。
- 代表类:
PipedInputStream
和PipedOutputStream
。
8. 数据流(Data Streams)
- 用于读写原始数据类型,自动转换为字节。
- 代表类:
DataInputStream
(从字节流中读取基本数据类型)和DataOutputStream
(向字节流中写入基本数据类型)。
9. 对象流(Object Streams)
- 用于对象的序列化和反序列化。
- 代表类:
ObjectInputStream
和ObjectOutputStream
。
10. 文件通道(File Channels)
- Java NIO 中的文件通道,提供对文件的高效访问。
- 代表类:
FileChannel
。
11. 内存映射文件(Memory-Mapped Files)
- 一种内存访问方式,允许将文件区域映射到内存中。
- 通过
FileChannel
实现。
12. 散射/聚集通道(Scattering/Gathering Channels)
- 散射通道允许从多个缓冲区读取数据并写入单一的目标通道。
- 聚集通道允许从单一的源通道读取数据并写入多个目标缓冲区。
示例用法
以下是使用字节输入流和字节输出流的示例:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class StreamCopyExample {
public static void main(String[] args) {
String fromFile = "source.txt";
String toFile = "destination.txt";
try (FileInputStream in = new FileInputStream(fromFile);
FileOutputStream out = new FileOutputStream(toFile)) {
int byteRead;
while ((byteRead = in.read()) != -1) {
out.write(byteRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
示例中,我们从一个文件读取数据并写入到另一个文件,展示了字节流的基本用法。