Java 中的流(Stream)分为两种类型:字节流和字符流。
字节流(Byte Stream)
字节流可以处理任何类型的数据,但是它们是以字节为单位进行操作的。Java 中提供了两种字节流:InputStream 和 OutputStream。
InputStream 是字节输入流,用于从数据源读取数据。InputStream 的常用子类包括:
FileInputStream:用于从文件中读取数据。
ByteArrayInputStream:用于从字节数组中读取数据。
PipedInputStream:用于从管道中读取数据。
OutputStream 是字节输出流,用于将数据写入到目标位置。OutputStream 的常用子类包括:
FileOutputStream:用于将数据写入文件。
ByteArrayOutputStream:用于将数据写入字节数组。
PipedOutputStream:用于将数据写入管道。
字符流(Character Stream)
字符流用于处理字符数据,它们是以字符为单位进行操作的。Java 中提供了两种字符流:Reader 和 Writer。
Reader 是字符输入流,用于从数据源读取字符。Reader 的常用子类包括:
FileReader:用于从文件中读取字符。
CharArrayReader:用于从字符数组中读取字符。
StringReader:用于从字符串中读取字符。
Writer 是字符输出流,用于将字符写入到目标位置。Writer 的常用子类包括:
FileWriter:用于将字符写入到文件。
CharArrayWriter:用于将字符写入到字符数组中。
StringWriter:用于将字符写入到字符串中。
Java 中的流可以按照流的作用分为不同的类型,包括:
节点流(Node Stream):直接从数据源读取或写入数据的流。
处理流(Filter Stream):在节点流的基础上增加了一些功能的流。例如,BufferedInputStream 可以使用缓存机制提高读取效率。
对象流(Object Stream):可以读取或写入 Java 对象的流。例如,ObjectInputStream 和 ObjectOutputStream。
在使用流时,应该遵循以下原则:
打开流:创建一个输入流或输出流的对象。
读写数据:使用流读取或写入数据。
关闭流:使用完流后,应该关闭流以释放资源。通常使用 try-with-resources 语句块来自动关闭流。
缓冲流(Buffered Stream)
缓冲流是处理流的一种,它使用缓存机制来提高 I/O 操作的效率。Java 中提供了两种缓冲流:BufferedInputStream 和 BufferedOutputStream。
BufferedInputStream 继承自 FilterInputStream,用于从输入流中读取数据并提供缓冲功能。BufferedOutputStream 继承自 FilterOutputStream,用于将数据写入到输出流中并提供缓冲功能。
在使用缓冲流时,应该遵循以下原则:
打开流:创建一个输入流或输出流的对象。
创建缓冲流:将输入流或输出流传递给 BufferedInputStream 或 BufferedOutputStream 的构造函数。
读写数据:使用缓冲流读取或写入数据。
关闭流:使用完缓冲流后,应该关闭缓冲流以释放资源。关闭缓冲流时,缓冲流会自动刷新缓存区。
转换流(InputStreamReader 和 OutputStreamWriter)
转换流是字符流和字节流之间的桥梁,它可以将字节流转换为字符流,也可以将字符流转换为字节流。Java 中提供了两种转换流:InputStreamReader 和 OutputStreamWriter。
InputStreamReader 将字节流转换为字符流,OutputStreamWriter 将字符流转换为字节流。转换流使用指定的字符集将字节流中的字节解码为字符,或将字符编码为指定的字节序列。
在使用转换流时,应该遵循以下原则:
打开流:创建一个输入流或输出流的对象。
创建转换流:将输入流或输出流传递给 InputStreamReader 或 OutputStreamWriter 的构造函数。需要指定字符集。
读写数据:使用转换流读取或写入数据。
关闭流:使用完转换流后,应该关闭转换流以释放资源。关闭转换流时,转换流会自动关闭底层的字节流或字符流。
对象流(Object Stream)
对象流可以读取或写入 Java 对象,包括基本数据类型和引用类型。Java 中提供了两种对象流:ObjectInputStream 和 ObjectOutputStream。
ObjectInputStream 从输入流中读取对象,ObjectOutputStream 将对象写入到输出流中。对象流需要将对象序列化和反序列化为字节序列。
在使用对象流时,应该遵循以下原则:
打开流:创建一个输入流或输出流的对象。
创建对象流:将输入流或输出流传递给 ObjectInputStream 或 ObjectOutputStream 的构造函数。
读写对象:使用对象流读取或写入对象。
关闭流:使用完对象流后,应该关闭对象流以释放资源。关闭对象流时,对象流会自动关闭底层的字节流或字符流。