主要内容
- 转换流
- 缓冲流
- 序列化流
- 打印流
1 缓冲流
提高IO流读写效率
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区
数组,通过缓冲区读写,减少系统IO 次数,从而提高读写的效率。
- 字节缓冲流: BufferedInputStream , BufferedOutputStream
- 字符缓冲流: BufferedReader , BufferedWriter
流对象使用规则:晚开早关
1.1 字节缓冲流
public BufferedInputStream(InputStream in)创建缓冲输入流 public BufferedOutputStream(OutputStream out)创建缓冲输出流
1.2 字符缓冲流
构造方法
public BufferedReader(Reader in)创建缓冲输入流 public BufferedWriter(Writer out)创建缓冲输出流
特有方法
BufferedReader:public String readLine(): 读一行字符串,没有返回null,不会读取回车换行符 BufferedWriter:public void newLine(): 换行,可跨平台
2 转换流
字符编码:
- 编码:字符按照制定规则转换字节
- 解码:字节按照指定规则转换字符
字符集(编码表)
- ASCII: 所有码表都囊括了ASCII
- IOS-8859-1:拉丁码表 ,没中文
- GBK:国际标准转换码 (Windows默认)
- UTF-8:万国码 (IDEA默认)
2.1InputStreamReader类
字节流到字符流的桥梁
构造方法
InputStreamReader(InputStream in) 创建一个默认编码字符流 InputStreamReader(InputStream in,String CharsteName) 创建一个指定编码格式的字符流
2.2 OutputStreamWriter类
字符流到字节流的桥梁
构造方法
OutputStreamWriter(OutputStream in) 创建一个默认编码字符流 OutputStreamWriter(OutputStream in,String CharsteName) 创建一个指定编码格式的字符流
3 序列化
3.1ObjectoutputStream类
保存java对象到文件中(序列化)
构造方法
public ObjectOutputStream(OutputStream out) 创建指定OutputStream的ObjectOutputStream
序列化操作
一个类序列化必须满足两个条件:
- 必须实现java.io.Serializable接口,
Serializable
是一个标记接口。- 该类的所有属性必须是可序列化的。如果有一个属性不需要序列化,则该属性必须注明是瞬态的,使用
transient
关键字修饰。
3.2 ObjectInputStream类
将之前使用ObjectOuttputStream序列化的数据恢复为对象(反序列化)
构造方法
public ObjectInputStream(InputStream in) 创建一个个指定InputStream的ObjectInputStream
反序列化操作1
public final Object readObject() 读取一个对象,找不到该类class文件,则抛出`ClassNotFoundException` 异常。
反序列化操作2
有class文件,但是class文件在序列化对象之后发生了修改,则抛出InvalidClassException 异常
原因:
1.该类的序列版本号与从流中读取的类描述符的版本号不匹配
2.该类包含位置数据类型
3.该类没有可以访问的无参数构造方法
解决办法:类中定义序列号
private static final long serialVersionUID = 487915646L序列化集合
如果要持久存储多个对象,存入集合直接存储List集合。
读取的时候可以确定对象的数量,避免了EOFException异常
4 打印流
4.1PrintStream类
注意事项
- 流操作数据目的,不操作数据源
只能输出不能读取
- PrintStream永远不会抛出IOException
会抛出FileNotFoundException异常构造方法
public printStream(String fileName) 使用指定的文件名创建打印流 public printStream(File file) 输出的目的地是一个文件 public printStream(OutputStream out) 输出的目的地是一个字节输出流
- write方法写数据,查看数据时会查询编码表97->a
- 自己的print/println方法写数据,数据会原样输出97->97
改变打印流向
System.setOut
方法改变输出语句的目的地为参数中传递的打印流目的地PrintStream ps = new PrintStream("目的地是打印流.txt"); System.setOut(ps)//把输出语句的目的地改为打印流的目的地 System.out.println("我在打印流的目的地输出"); ps.close();
System.out
获取的就是一个标准输出流,默认指向控制台