节点流可以从一个特定的数据源读写数据,如FileReader,FileWriter等等
处理流(也叫包装流)是“连接”在已存在的流(节点流或处理流)之上,为程序提供更强大的读写功能,如BufferedReader,BufferedWriter等等
== 节点流和处理流的区别和联系
1.节点流是底层流/低级流,直接跟数据源相接
2.处理流包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出
3.处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连
==处理流的功能主要体现在以下两个方面
1.性能的提高:主要以增加缓冲的方式来提高输入输出的效率
2.操作的便捷:处理流可能提供了一系列的方法来一次输入输出大批量的数据,使用更加灵活方便
BufferedReader:字符缓冲输入流
使用BufferedReader读取文本文件,并显示在控制台
BufferedWriter:字符缓冲输出流
使用BufferedWrite将“你好,I/O流”,写入文件中
前面的输入输出流有提到追加和覆盖的概念,这里如果要实现追加,我们可以看到只能在节点流的构造器中实现。
在缓冲流中没有提供这样的构造,所以在节点流中实现
接下来通过这两个缓冲流实现文件的拷贝
BufferedInputStream:字节缓冲输入流
BufferedOutputStream:字节缓冲输出流
这里不再分开写两种缓冲流的例子,直接实现一个图片的拷贝举例。
对象流:
我们来看几个需求,便于理解对象流:
1.将 int num = 100这个 int 数据保存到文件中,注意不是数字100,而是 int 100 ,既保存类型,也保存值,并且还能够从文件中直接恢复 int 100
2.将 Dog dog = new Dog ("小韩" , 4) 这个dog对象保存到文件中,并且能够从文件恢复。
3.可以看到上面两个要求,就是能够将基本数据类型或者对象进行序列化和反序列化操作
序列化和反序列化:
1.序列化就是在保存数据时,保存数据的值和数据类型
2.反序列化就是在恢复数据时,恢复数据的值和数据类型
3.需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
1.Serializable :这是一个标记接口,没有任何方法
2.Externalizable:该接口有方法需要实现,因此一般用上面的接口
ObjectOutputStream:字节对象输出流 (提供序列化功能)
案例:使用ObjectOutputStream序列化基本数据类型和一个Dog对象(name,age),并保存到data.dat文件中
ObjectInputStream:字节对象输入流 (提供反序列化功能)
案例:使用ObjectInputStream 将上面的data.dat读取,并反序列化恢复数据
节点流处理流注意事项和细节说明:
1.读写顺序要一致
2.要求实现序列化或反序列化对象,需要实现Serializable
3.序列化的类中建议添加SerailVersionUID为了提高版本得的兼容性
4.序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
5.序列化对象时,要求里面属性的类型也需要实现序列化接口
6.序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也默认实现了序列化
标签:Java,处理,对象,缓冲,分类,实现,序列化,节点 From: https://www.cnblogs.com/zhulei118/p/16643278.html