总结 ##### java将流分为两类:节点流与处理流: - **节点流**:也称为**低级流**. 节点流的另一端是明确的,是实际读写数据的流,读写一定是建立在节点流基础上进行的. - **处理流**:也称为**高级流**. 处理流不能独立存在,必须连接在其他流上,目的是当数据流经当前流时对数据进行加工处理来简化我们对数据的该操作. ##### 实际应用中,我们可以通过串联一组高级流到某个低级流上以流水线式的加工处理对某设备的数据进行读写,这个过程也成为流的连接,这也是IO的精髓所在. ## 缓冲流 缓冲流是一对高级流,在流链接中链接它的**目的是加快读写效率**。缓冲流内部**默认缓冲区为8kb**,缓冲流**总是块读写数据来提高读写效率**。 #### java.io.BufferedOutputStream缓冲字节输出流,继承自java.io.OutputStream ##### 常用构造器 - BufferedOutputStream(OutputStream out):创建一个默认8kb大小缓冲区的缓冲字节输出流,并连接到参数指定的字节输出流上。 - BufferedOutputStream(OutputStream out,int size):创建一个size指定大小(单位是字节)缓冲区的缓冲字节输出流,并连接到参数指定的字节输出流上。 ##### 常用方法 ``` flush():强制将缓冲区中已经缓存的数据一次性写出 缓冲流的写出方法功能与OutputStream上一致,需要知道的时write方法调用后并非实际写出,而是先将数据存入缓冲区(内部的字节数组中),当缓冲区满了时会自动写出一次。 ``` #### java.io.BufferedInputStream缓冲字节输出流,继承自java.io.InputStream ##### 常用构造器 - BufferedInputStream(InputStream in):创建一个默认8kb大小缓冲区的缓冲字节输入流,并连接到参数指定的字节输入流上。 - BufferedInputStream(InputStream in,int size):创建一个size指定大小(单位是字节)缓冲区的缓冲字节输入流,并连接到参数指定的字节输入流上。 ##### 常用方法 ``` 缓冲流的读取方法功能与InputStream上一致,需要知道的时read方法调用后缓冲流会一次性读取缓冲区大小的字节数据并存入缓冲区,然后再根据我们调用read方法读取的字节数进行返回,直到缓冲区所有数据都已经通过read方法返回后会再次读取一组数据进缓冲区。即:块读取操作 ``` ### 对象流 对象流是一对高级流,在流链接中的作用是完成对象的**序列化**与**反序列化** 序列化:是对象输出流的工作,将一个对象按照其结构转换为一组字节的过程。 反序列化:是对象输入流的工作,将一组字节还原为对象的过程。 #### java.io.ObjectInputStream对象输入流,继承自java.io.InputStream ##### 常用构造器 ObjectInputStream(InputStream in):创建一个对象输入流并连接到参数in这个输入流上。 ##### 常用方法 Object readObject():进行对象反序列化,将读取的字节转换为一个对象并以Object形式返回(多态)。 如果读取的字节表示的不是一个java对象会抛出异常:java.io.ClassNotFoundException #### java.io.ObjectOutputStream对象输出流,继承自java.io.OutputStream ##### 常用构造器 ObjectOutputStream(OutputStream out):创建一个对象输出流并连接到参数out这个输出流上 ##### 常用方法 void writeObject(Object obj):进行对象的序列化,将一个java对象序列化成一组字节后再通过连接的输出流将这组字节写出。 **如果序列化的对象没有实现可序列化接口:java.io.Serializable就会抛出异常:java.io.NotSerializableException** #### 序列化接口java.io.Serrializable 该接口没有任何抽象方法,但是只有实现了该接口的类的实例才能进行序列化与反序列化。 实现了序列化接口的类建议显示的定义常量:static final long serialVersionUID = 1L; 可以为属性添加关键字**transient**,被该关键字修饰的属性在序列化是会被忽略,达到对象**序列化瘦身**的目的。
07-11
596

07-10
1万+

02-10
739
