day010-缓冲流、转换流、序列化流

 1.     缓冲流

又称为高效流。高效流高效的原理:使用缓冲区(数组)临时存储多个数据,减少底层资源的调用次数。从而提高读写速度。

1.1 缓冲流分类

字节缓冲流:

BufferedOutputStream

BufferedInputStream

字符缓冲流:

BufferedWriter

BufferedReade

r

扫描二维码关注公众号,回复: 1531219 查看本文章

1.2字节缓冲输出流

BufferedOutputstram

1.2.1 构造方法

            public BufferedOutputStream(OutputStream out)

创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

1.2.2 BufferedOutputStream类成员方法

Write方法:输出一个字节,输出一个字节数据,输出字节数组的一部分

利用字节缓冲输出流输出数据不是直接输出到目标文件中,而是先存储内部的的缓冲区数组中,直到缓冲区满了或调用了flush或close方法,才会将缓冲区的数据输出到目标文件中。

 

1.3 字节缓冲输出流BufferedInputstream

根据字节输入流对象创建字节缓冲输入流。

目前可以传递的字节输入流对象:FileInputStream

传递谁就提高谁的效率

1.3.1 BufferedInputStream类成员方法

       read:读一个字节,读一个字节数组

1.4注意事项

       利用字节缓冲输入流读取数据时不是直接从目标文件中读取,而是从缓冲区中读取,如果缓冲区没有内容或缓冲区的内容已经读完了,就会通过字节输入流从目标目标文件中读取数据。

1.5 BufferedWriter类

字符输出缓冲流

       根据字符输出流创建缓冲区

       传递谁就提高谁的效率

1.5.1 BufferedWriter构造方法

BufferedWriter(Writer writer)

1.5.2 BufferedWriter常用方法

Write:一次输出一个字符、字符串
       newline():特有方法,换行

1.6 BufferedReader类

字符缓冲输入流

1.6.1 BufferedReader常用方法

read 方法:一次读取一个字符,一个字符数组,字符数组的一部分

       readLine():读取一行数据

2.转换流

2.1转换流分类

OutputStreamWriter

InputStreamReader

转换流本质就是字符流,也是只能操作文本文件。

2.2为什么需要转换流

因为FileReader或BufferedReader读取数据时只能使用默认的码表,不能修改。

文本文件的编码方式不是默认编码(utf-8),使用FileReader或BufferedReader读取数据,就会出现乱码。

2.3 InputStreamReader

作用:是字节流通向字符流的桥梁。

2.3.1 构造方法

InputStreamReader(InputStream in)   //根据字节输入流创建字符转换输入流对象

默认使用的是utf-8码表

public InputStreamReader(InputStream in, String charsetName)

in:可以传递的字节输入流FileInputStream、BufferedInputStream

charsetName:指定码表名称,常用码表名称:utf-8,gbk

              2.3.2 成员方法

                     read方法:读一个字符,一个字符数组

2.3.4 字符转换输入流转换过程

先有字符输入流从目标文件中读取数据,读到的是一对二进制数据,然后将读取到的二进制数据交给字符转换输入流,有字符转换输入流查询对应的码表得到对应的字符

2.4 OutputStreamWriter类

继承Writer,本质是字符输出流。只能操作文本文件。用法和FileWriter和BufferedReader,区别在该类可以指定码表输出数据。

2.4.1常用构造方法

    public OutputStreamWriter(OutputStream out, String charsetName)

2.4.2 OutputStreamWriter转换过程

先由字符转换输出流将字符查询对应的码表,得到对应的二进制数据,然后将二进制数据交给字节输出流输出到目标文件中。

3.对象流

对象流又称为序列化流

3.1对象序列化概述

直接将对象以流的形式保存到文件中的过程则称为对象的序列。

要实现对象的序列化操作需要使用流:ObjectOutputStream

3.2对象反序列化概述

将对象数据从文件中读取出来的过程则称为对象的反序列化

要实现对象的饭序列化操作需要使用流:ObjectInputStream

3.3对象流的分类

       对象输出流:ObjectOutputStreamè对象序列化

       对象输入流:ObjectInputStreamè对象反序列化

       3.4构造方法

       public ObjectOutputStream(OutputStream out)    
            实现对象的序列化
 
      public ObjectInputStream​(InputStream in)
            实现对象的反序列化
    3.5常用方法
        public final void writeObject(Object obj)
           将指定的对象写入ObjectOutputStream
 

public Object readObject();  从流关联的目标文件中读取对象

 

3.6 Serializable接口概述

              是一个标记性接口.只有实现了该接口的类对象才可以序列化到文件中

    注意事项:
     (a)被序列化的对象要实现Serializable接口。
     (b)对象序列化只会序列化对象的信息,不能序列化类的信息。
 
    3.7 Transient关键字概述
Transient的中文翻译是瞬时。用来修饰成员变量,能够保证该成员变量的值不被序列化到文件中
      3.7.1 Transient关键字格式
          修饰符 Transient 数据类型 变量名
 
    3.8序列号冲突的解决方案
      解决方法:自定义序列号,自己提供一个固定值的序列号。
   原因:类一定实现了Serializable接口,每次编译生成class文件时,都会随机关联一个序列号
  3.8.1 固定序列号的例子

private static final long serialVersionUID = 1478652478456L;

这样每次编译类时⽣生成的serialVersionUID值都是固定的

4.打印流

该类能够方便地打印各种数据类型的值,是一种便捷的输出方式

5. 小结

5.1字符流小结

              5.1.1字符输入流Reader

FileReader  非缓冲流,效率低,不可以修改码表

BufferedReader 缓冲流,效率高,不可以修改码表

InputStreamReader   转换流,可以修改码表

5.1.2字符输出流Writer

FileWriter   非缓冲流,效率低,不可以修改码表

BufferedWriter   缓冲流,效率高,不可以修改码表

OutputStreamWriter 转换流,可以修改码表

           5.1.3字符流的选择

如果需要修改码表,则只能选择InputStreamReader和OutputStreamWriter

如果不需要修改码表,则推荐使用BufferedReader和BufferedWriter

5.2字节流小结

5.2.1字节输入流InputStream

FileInputStream            非缓冲流

BufferedInputStream    缓冲流,效率高,推荐使用

ObjectInputStream       对象流,要读取自定义对象时使用

5.2.2字节输出流OutputStream

FileOutputStream                非缓冲流

BufferedOutputStream        缓冲流,效率高,推荐使用

ObjectOutputStream           对象流,要读取自定义对象时使用

PrintStream                         希望要原样输出各种数据类型的值

猜你喜欢

转载自www.cnblogs.com/gzyzhui/p/9157752.html