缓冲流
概述:高效流,对四个基本流的增强,以Buffered
开头。在创建流对象时,会创建一个内置的缓冲区数组来进行一次读写,以减少IO次数。
构造方法
-
BufferedInputStream(InputStream in)
创建一个缓冲输入流并保存其参数,即输入流 in。可使用父类成员方法如read。 -
BufferedOutputStream(OutputStream out, int size)
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。使用步骤:
- 创建输出流对象,构造方法中传入目的地址。
- 创建缓冲输出流对象,构造方法参数为上面的输出流对象。一般大小用默认。
- 调用write方法将数据写入到内部缓冲区。
- 调用close释放资源(默认关闭前刷新),只关闭缓冲流即可。
字符缓冲流
-
BufferedReader(Reader in)
String readLine()
读取一个文本行。 标识符为换行 (’\n’)、回车 (’\r’) 或回车后直接跟着换行,返回包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null。 -
BufferedWriter(Writer out)
void newLine()
写入一个系统对应的行分隔符。
转换流
概述:编码是将字符转换为字节,解码相反。字符集Charset
也叫编码表,是一个系统支持的所有字符的集合。GBK
为最常用的国标中文编码表一个字符对应2字节,Unicode
为统一码,其中UTF-8
中文字节对应3字节。
-
OutputStreamWriter输出转换流
-
概述:字符流通向字节流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。(idea中为UTF-8)
-
构造方法:
OutputStreamWriter(OutputStream out, String charsetName)
创建使用指定字符集的 OutputStreamWriter,传递参数为字节输出流和编码表名称(不区分大小写),再调用write方法实现将字符写入为字节即可。
-
-
InputStreamReader输入转换流
-
概述:字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
-
构造方法:
InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。参数中传入的编码表要和输入流文件的编码方式相同,否则发生乱码。
-
序列化流
概述:ObjectOutputStream
将 Java 对象的基本数据类型和图形写入 OutputStream
。可以使用 ObjectInputStream
读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。
-
ObjectOutputStream(OutputStream out)
创建写入指定 OutputStream 的 ObjectOutputStream。只能将实现java.io.Serializable
接口的对象写入流中。void writeObject(Object obj)
将指定的对象写入 ObjectOutputStream。 -
ObjectInputStream(InputStream in)
创建从指定 InputStream 读取的 ObjectInputStream。使用前提为实现Serializable
接口和类的.class
文件存在,否则抛出类找不到异常。Object readObject()
从 ObjectInputStream 读取对象。
tips:
- 被
transient
关键字修饰的成员变量不能被序列化,会变为默认值。 - 在类实现Serializable接口时会为其class文件添加一个序列号,在序列化时也会对其txt文件标记同样的序列号,反序列化时会比较两者,不同则抛出
InvalidClassException
异常(如对该类进行修改后直接反序列化)。避免该情况的做法是为该类显式声明其自己的 serialVersionUID,如:static final long serialVersionUID = 42L;
。