第十九章 IO流2
- 14.Buffered字节处理流(BufferedIn/OutputStream)
- 15.字节处理流拷贝文件
- 16.对象处理流
- 17.ObjectOuputStream
- 18.ObjectInputStream
- 19.对象处理流使用细节
- 20.标准输入输出流
- 21.乱码引出转换流
- 22.InputStreamReader
- 23.OutputStreamWriter
- 23.PrintStream(打印流/字节输出流)
- 24.PrintWriter(打印流/字符输出流)
- 25.配置文件引出Properties
- 26.Properties读文件
- 27.Properties创建修改文件
- 28.本章家庭作业01
- 29.本章家庭作业02
- 30.本章家庭作业03
14.Buffered字节处理流(BufferedIn/OutputStream)
15.字节处理流拷贝文件
拷贝成功
下面我们试一下视频文件
拷贝成功,视频可以播放
可以的,文本文件的底层最终还是按照字节来处理的
拷贝成功
16.对象处理流
我们实际开发中,有这样一个需求,我们在保存一个数据的值的时候,同时也希望将它的数据类型保存起来。比如下面这个,我们要保证这个100是int类型的,而不是String类型的。保证这个1.1是float类型而不是double类型的。
Serializable中没有任何方法
ObjectOut/InputStream处理流,使用修饰器模式
17.ObjectOuputStream
这里dat改成my,txt等等都可以
存储字符串的时候,不是writeString(),而是writeUTF()
这时运行会出现一个异常,因为Dog类没有实现Serializable
有些数据已经变成乱码了,因为不是存文本的
18.ObjectInputStream
In和out的顺序必须一致,不然会抛出异常
下面重写一下dog的toString方法
但此时又抛出了异常,因为没有重新执行ObjectOutputStream方法
下面还有一个细节,比如Dog类中有get,set方法。我们想要在ObjectInputStream中调用这个方法,需要进行向下转型(因为此时dog是Object),但ObjectInputStream中并没有Dog类,无法向下转型。
所以要将Dog类赋值到ObjectInputStream中
这里还是错误的,因为复制过去的Dog类跟原来的Dog类本质上不是同一个类
为了让ObjectInputStream与ObjectOutputStream都可以用到Dog类,这里将Dog类做成public类型,这样InputStream_ 与OutputStream_两个包都可以用Dog这个类
之后再分别重新运行ObjectOutputStream与ObjectInputStream
19.对象处理流使用细节
(3)
加上这一句话,我们在类中添加新的属性时,比如hobby时,系统不会认为因为你添加了一个属性,这个类就变成了一个全新的类,他认为只是原先类的修改版
(4)
我们看一下ObjectInputStream方法能不能将color与nation两个输出来,就能够确认之前的想法
正常情况下,应该输出dog的所有信息,但是color与nation都是空的
说明它在序列化的时候,并没有保存这个属性
(5)
里面的name,age,nation和color分别为String,int类型的,这两个类型都实现了序列化,但是此时我们新增一个master,而Master类是没有实现序列化,此时运行
ObjectOutputStream会报错
将Master序列化即可
(6)
20.标准输入输出流
21.乱码引出转换流
默认情况下读取文件是按照utf-8编码,如果我们将a.txt文件的编码换成ANSI(国标码)
出现乱码问题的原因是我们没有指定读取文件的编码方式,如果我们可以指定文件的编码方式,问题就能得到解决
转换流就是将字节流转换成字符流,我们在字节流上面可以指定编码
22.InputStreamReader
上面的ANSI相当于gbk
不再是乱码
上面的写法有点麻烦,很多程序员会将第二步和第三步合在一起
23.OutputStreamWriter
保存成功
现在的编码是gbk(ANSI),下面我们将其改成utf-8
23.PrintStream(打印流/字节输出流)
24.PrintWriter(打印流/字符输出流)
上面是打印到显示器,如果我们想要打印到文件
显示屏上面就没有输出了
最后一定要关闭,不然不会更新
25.配置文件引出Properties
但是上面的写法十分麻烦,我们可以用Properties方便的实现
26.Properties读文件
27.Properties创建修改文件
创建
hello world 表示的是注释,null就是没有注释
修改
28.本章家庭作业01
创建成功
下面在其中添加hello,world~
添加成功
29.本章家庭作业02
30.本章家庭作业03
这里get到的是一个Object类型,我们要将其转换成一个字符串类型
下面我们再进行一下反序列化操作