1. IO流的体系结构
- IO流的使用原则:随用随创建,什么时候不用什么时候关闭
- 1.1 io流的体系结构图
-
1.2缓冲流的分类
缓冲流,也叫高效流,是对4个基本的FileXxx流的增强- 字节缓冲流:BufferedInputStream,BufferedOutputStream
- 字符缓冲流:BufferedReader,BufferedWriter
- 缓冲流的基本原理:在创建流对象时,会创建一个内置的默认长度为8192字节/字符的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率
2.字节缓冲流
-
2.1构造方法
- public BufferedInputStream(InputStream in)
创建一个 新的缓冲输入流。
- public BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流。
- public BufferedInputStream(InputStream in)
- 2.2注意:只需要关闭缓冲流即可,基本流的关闭已经被包装好了
3.字符缓冲流
-
3.1构造方法
- public BufferedReader(Reader in)
创建一个 新的缓冲输入流
- public BufferedWriter(Writer out)
创建一个新的缓冲输出流
- public BufferedReader(Reader in)
-
3.2特有方法
- BufferedReader:public String readLine()
读一行文字,如果没有数据返回Null
- BufferedWriter:public void newLine()
写一行行分隔符,由系统属性定义符号。 (跨平台的换行)
- BufferedReader:public String readLine()
4.转换流
- 4.1字符编码和字符集
-
4.2转换流的作用
- 指定字符集读取数据(JDK11之后被淘汰)
代替的构造方法:
FileReader(String fileName,Charset BM)
FileWriter(String fileName,Charset BM)
注意:Charset是一个类,可以调用此类中的Charset.forName(String BM)
- 字节流想要使用字符流中的方法
- 指定字符集读取数据(JDK11之后被淘汰)
-
4.3InputStreamReader类
- 介绍:
- 转换流java.io.InputStreamReader,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。
-
构造方法:
- InputStreamReader(InputStream in)
创建一个使用默认字符集的字符流
- InputStreamReader(InputStream in, String charsetName)
创建一个指定字符集的字符流
- InputStreamReader(InputStream in)
- 介绍:
-
4.4OutputStreamWriter类
- 介绍:
- 转换流java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。
-
构造方法:
- OutputStreamWriter(OutputStream in)
创建一个使用默认字符集的字符流
- OutputStreamWriter(OutputStream in, String charsetName)
创建一个指定字符集的字符流
- OutputStreamWriter(OutputStream in)
- 介绍:
-
4.5转换流理解图解
- 转换流是字节与字符间的桥梁
5.序列化
-
5.1概述
- Java 提供了一种对象**序列化**的机制。用一个字节序列可以表示一个对象,该字节序列包含该`对象的数据`、`对象的类型`和`对象中存储的属性`等信息。字节序列写出到文件之后,相当于文件中**持久保存**了一个对象的信息。
- 反之,该字节序列还可以从文件中读取回来,重构对象,对它进行**反序列化**。`对象的数据`、`对象的类型`和`对象中存储的数据`信息,都可以用来在内存中创建对象。
- 图解
-
5.2ObjectOutputStream类
java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。- 构造方法:public ObjectOutputStream(OutputStream out)
创建一个指定OutputStream的ObjectOutputStream
- 写出对象方法:public final void writeObject (Object obj)
将指定的对象写出
-
序列化操作条件
- 该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。
- 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。
- 构造方法:public ObjectOutputStream(OutputStream out)
-
5.3ObjectInputStream类
ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。- 构造方法:public ObjectInputStream(InputStream in)
创建一个指定InputStream的ObjectInputStream
- 读取对象方法:public final Object readObject ()
读取一个对象
- 注意:对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个 ClassNotFoundException 异常
- 注意:Serializable 接口给需要序列化的类,提供了一个序列版本号。serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。
private static final long serialVersionUID = 1L;
- 构造方法:public ObjectInputStream(InputStream in)
-
5.4细节汇总
-
- 需要让JavaBean类实现Serialzable接口
-
- 文件中的序列化数据修改后无法再次读取
-
- 修改JavaBean后,再次反序列化会抛出InvalidClassException异常,解决方案:添加序列号
-
- 给成员变量添加transient关键字修饰,该关键字标记的成员变量不参与序列化过程。
-
- 当不确定有多少对象需要序列化,使用集合,将集合序列化。
-
6.打印流
-
平时我们在控制台打印输出,是调用print方法和println方法完成的,这两个方法都来自于java.io.PrintStream类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。
-
6.1分类
- 字节打印流:PrintStream
- 字符打印流:PrintWriter
-
6.2特点
- 打印流只操作文件目的地,不操作数据源
- 特有的写出方法可以实现数据原样写出
- 特有的写出方法,可以实现自动刷新,自动换行
-
6.3字节打印流
- 构造方法
- 成员方法
-
6.4字符打印流
- 构造方法
- 成员方法
-
6.5改变打印流的流向
- 打印流的流向