2022-08-09 第四组 王佳齐 学习笔记
思维导图
学习笔记
IO流(输入输出流)
1.按照流向分
输入流:从硬盘上读取数据到内存。(读)
输出流:从内存写出数据到硬盘。(写)
一个文件在传输过程中经历了多次的拷贝。IO的性能本身很低。
2.按照操作单元分
字节流:是一个字节一个字节的操作。二进制操作。操作任意类型的文件。
字符流:是一个字符一个字符的操作。一个字符是两个字节,主要用来处理文本文件【只能有文
字】
.txt,.java,.py,.xml,.properties,.html,.css,.js
3.按照角色划分
节点流:直接操作一个特定的IO设备。
处理流:在节点流的基础上,做进一步的处理。
在Java中输入、输出流常用的流
字节输入流 |
字节输出流 |
字符输入流 |
字符输出流 |
|
抽象基类 |
InputStream |
OutputStream |
Reader |
Writer |
访问文件(节点流) |
FileInputStream |
FileOutputStream |
FileReader |
FileWriter |
缓冲流(处理流) |
BufferedInputStream |
BufferedOutputStream |
BufferedReader |
BufferedWriter |
操作对象【只能字节操作】 |
ObjectInputStream |
ObjectOutputStream |
流到底怎么用?
输入流:一点一点的往内存中读数据!
字节输入流:
1.创建一个FileInputStream对象【多态的方式】
2.定义一个标记用来控制输入流的读取
3.循环读取,如果读取到了-1,说明文件读到了末尾
4.关闭资源*****
注意:我们发现一个流读完了就没有了,不可再读;当一个流读完之后,会默认调用mark和
reseset方法来进行记录和重置,这个流就已经重置到了上次读完的位置,所以就无法再
次读取内容,并不是读完一次之后就关闭了流,流是不会自己关闭的。
字节输出流:
FileOutputStream构造器
boolean append参数:如果传入true,则代表在原有的基础上追加,不覆盖;
如果传入false,或者不传,覆盖原有内容。
写的操作,目标文件如果不存在会自动新建。
字符流:【了解】
字符处理流(用的最多)
缓冲流:【可以读写字符串】
外层流,内层流,外层流关闭,内层流也关闭了;
序列化与反序列化:操作对象
序列化:将对象写入到IO流当中,把内存中的对象变成字节数字,可以机型存储和传输
反序列化:从IO流中恢复对象,将存储在硬盘上或者从网络中接收的数据恢复成对象模型
使用场景:所有可在网络上传输的对象都必须是可序列化的,否则会报错,所有保存在硬盘上的对
象也必须是可序列化的。
序列化版本号:
反序列化必须拥有class文件,但随着项目的升级,class文件也会升级,序列化保证了升级前后的
兼容性。
如何保障的?
在序列化时,除了要实现序列化接口,还要加上版本号,不加的话,如果改变了原本类中的某些内
容会导致在读文件时找不到,版本号可以自由指定,如果不指定,JVM会根据类信息计算版本号,
与原来的无法匹配,读的时候会报错,如果不写版本号,不利于JVM的移殖,不同的JVM计算规则
不同,可能会导致反序列化无法进行;如果只是更高方法无需修改版本号,如果修改的是静态/瞬态
变量也无需修改版本号,反序列化不会受到影响。
总结
1.所有要进行网络传输的对象都需要实现序列化接口
2.对象的类名,实例变量都会被序列化,但是方法和类变量以及瞬态变量不会被序列化
3.如果想让某个变量不被序列化,可以使用transient修饰
4.序列化对象的引用类型成员变量,也必须是可序列化的,否则会报错
5.反序列化时,必须有序列化对象的.class文件
6.如果一个对象被序列化多次,只有第一次时二进制流,以后都只要保存序列化的版本号
7.建议所有的可序列化的类加上版本号
我们最终会吧所有的.class文件打包,把这个包部署到服务器上
从始至终.java仅仅是我们程序员写的,给程序员看的
.java甚至不会参与到打包中,不会出现在服务器上
运维人员部署的是.class文件
我们的.properies属性文件不会参与编译,一但数据库升级,改变此文件即可,否则要改变源码,
很耗费资源
File类不能够操作文件的内容
学习心得:今天学了很多IO流的类,有点混乱,晚上做一遍案例和思维导图之后,清晰了很多。