IO补充

来源:互联网 发布:攻破网站数据库 编辑:程序博客网 时间:2024/05/18 11:05

SequenceInputStream 合并输入流

创建对象时传入输入流通道对象,这些输入对象会被合
并到SequenceInputStream中,读取时直接读取
SequenceInputSream的对象即可,调用其close方法
会关闭传给它的输入对象

当要多个合并时:


Vector vecter=new Vecter();
vecter.add(fileInputStream1);
vecter.add(fileInputStream2);
vecter.add(fileInputStream3);
……….
Enumeration e=vector.elements();
SequenceInputStream sequenceInputStream=new SequenceInputStream(e);

对象的输入输出流

作用:写对象的信息与读取对象的信息,对象信息一旦写到文件上
那么对象的信息就实现持久化了

对象的输出流:ObjectOutputStream

使用步骤:
1.前面与文件输出流一致
2.讲文件输出对象传入ObjectOutoutStream中创建对象
3.调用writeobject方法储存对象信息,储存的信息是给jvm看的

注:如果对象需要被写到文件中,需要对象对应的类实现Serializable接口
该接口没有需要实现的方法,实现该接口只是作为一种标记

对象的输入流:ObjectInputstream
注:
1.建立使用时除了会抛出IOException,还要抛出一个ClassNotFoundException
2.存储进文件的对象的信息是给jvm看的序列化文件,我们看需要反序列化
也就是使用输入流
3.serialVersionUID是用来记录class文件的版本信息的,serialVersionUID
这个数组是用过一个类的类名,成员,包名,工程名算出的一个数字
4.反序列化时,ObjectInputStream会读取文件中的serialVersionUID与class文件
中的serialVersionUID进行对比,如果两个id不一致,则反序列化失败(可以减少成员
变量,不能增加)
5.如果序列化与反序列化的时候可能要修改类的成员,那么最好一开始就给这个类指定
一个serialVersionUID,如果一个类已经指定的serialVersionUid,然后在序列化的
时候,jvm就不会再计算serialVersionUID了
6.当使用transient作为关键字修饰成员变量时,那这个数据不会被序列化到硬盘上
7.如果这个类维护了另外一个类的引用,那另一个类也需要实现Serializable接口

配置文件类

Properties:主要用于生产配置文件与读取配置文件的信息
方法:
1.store:传入一个输出流对象,对配置文件输出
2.load:传入一个输入流对象,将输入流对象对应的
文件输出到配置文件
3.setProperty(),改变键对应的值
注:
1.Properties已实现Map接口
所以Properties可以使用put和putAll方法,但不建议使用,
建议使用properties的setProperty,因为那两个方法可以
设置任意的键和值,但配置文件储存时全部强转为String
然后调用该对象的store方法,穿参数为一个输出流对象和
一个字符串描述这个配置文件的信息
2.如果配置文件的信息一旦使用了中文,那么store方法生成
配置文件的时候只能使用字符流,若果使用字节流,默认使用
iso8859-1码表编码,这时候会出现乱码
3.使用setProperty后要再次储存,不然配置文件内容未修改信息

解码与编码

编码:把看的懂得字符变成看不懂的码值的过程
解码:把看不懂的码值变成看得懂的字符的过程

getBytes():把字符串变成自己数组,是编码的过程
可以传一个编码表,按照该编码表编码

new String():解码的过程,,传入一个字节数组,
变成字符串,可以在字节数组后传入一个编码表,按编
码表来解码

注:一般都使用统一的编码表,避免乱码

转换流

输入字节流转输入字符流
InputStreamReader

输出字节流转输出字符流
InputStreamWriter

作用
1.目前获取到的是字节流,但需要使用字符流的时候使用
2.可以用指定码表读取和储存文件