过滤流

8.过滤流

FilterInputStream/FilterOutputStream和FilterReader/FilterWriter

8.1桥接转换流

  • InputStreamReader和OutputStreamWriter提供了字节流和字符流之间的桥接转换功能,用于与字节数据到字符 数据之间的转换,无需编程实现将字节拼接为字符
  • 转换流可以在构造时指定其编码字符集
  • InputStreamReader用于将一个InputStream类型的输入流自动转换为Reader字符流
  • OutputStreamWriter用于将一个Writer字符输出流转换为OutputStream字节输出流

InputStreamReader构造器

  • InputStreamReader(InputStream)
  • InputStreamReader(InputStream, String)
  • InputStreamReader(InputStream, Charset)
  • InputStreamReader(InputStream, CharsetDecorder)

8.2缓冲流

缓冲流是套接在响应的节点流之上,对续写的数据提供缓冲的功能,提高读写的效率,同时增加了一些新方法
以介质是硬盘为例,字节流和字符流的弊端:在每一次读写的时候,都会访问硬盘。 如果读写的频率比较高的时 候,其性能表现不佳。为了解决以上弊端,采用缓存流。
缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都是在缓存中访问,直到缓存中的数 据读取完毕,再到硬盘中读取

构造方法

  • BueredReader(Reader)不定义缓存大小,默认8192
  • BueredReader(Reader in, int size)size为自定义缓冲区的大小
  • BueredWriter(Writer)
  • BueredWriter(Writer out, int size)size为自定义缓冲区的大小
  • BueredInputStream(InputStream)
  • BueredInputStream(InputStream in, int size)size为自定义缓冲区的大小
  • BueredOutputStream(OutputStream)
  • BueredOutputStream(OuputStream out, int size)size为自定义缓冲区的大小

缓冲输入流的方法

BuedReader提供了一个方法readLine():String,但是BueredInputStream中并没有这个

  • BueredReader提供了readLine方法用于读取一行字符串,以\r或\n分割(换行符)
  • 如果读取内容为null,则表示读取到了流的末尾
    • readLine方法会自动剔除本行内容末尾的换行符
    • BueredWriter提供了newLine方法用于写入一个行分隔符
      对于输出的缓冲流,写入的数据会先在内存中缓存,使用ush方法会使内存中的数据立即写出

8.3数据流

DataInputStram和DataOutputStream分别继承自InputStream和OuputStream,属于过滤流,需要分别套接在 InputStream和OutputStream类型的节点流上

  • 只有字节流,没有对应的字符流

DataInputStream和DataOutputStream提供了可以存取与机器无关的Java原始类型数据的方法
DataInputSteram和DataOutputStream构造方法为

  • DataInputStream(InputStream)
  • DataOutputStream(OutputStream)

8.4打印流

PrintStream和PrintWriter都属于输出流,分别针对字节和字符

PrintWriter和PrintStream都提供了重载的print和println方法用于输出多种类型数据

println表示输出后自动换行

  • PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息
  • PrintWriter和PrintStream有自动的ush功能 textOut.flushBuffer();

PrintWriter(Writer)

PrintWriter(Writer out, boolean autoFlush)自动刷新----println

8.5对象流

使用DataInputStream或者DataOutputStream可以读写对象数据

读写一个对象的前提是这个类型的对象是可以被序列化的;

  • NotSerializableException
    对象序列化【简单来说就是将对象可以直接转换为二进制数据流】/对象的反序列化【可以将二进制数据流转换为 对象】,这一般依靠JVM实现,编程中只做声明对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传 输对象。对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保 存在磁盘上,通过网络将这种二进制流传输到另一个网络节点,其他程序一旦获取到这种二进制流,都可以将这种 二进制流恢复成原来的Java对象

1、如何声明对象所属于的类可以进行序列化和反序列化Serializable/Externalizable接口
其中的接口没有任何定义,仅仅只起到了说明的作用,这种接口叫做标志接口或者旗标接口
2、可以通过ObjectInputStream【readObject():Object】和ObjectOutputStream【writeObject(Object):void】 提供的方法直接操作对象
3、输出对象

4、读取对象

编码细节

1、需要通过对象流读写的对象必须实现了序列化接口,否则需要java.io.NotSerializableException

2、Serializable接口是标志接口,没有需要实现的方法,所有的序列化和反序列化操作由VM负责实现。 Externalizable接口定义为public interface Externalizable extends java.io.Serializable,这个接口中包含两个方 法需要实现writeExternal自定义实现对象的序列化,readExternal自定义实现对象的反序列化。除非特殊需求一般 不使用Externalizable接口,因为没有必要自定义

3、类型转换问题:

4、private static nal long serialVersionUID = 6889840055394511246L
如果不添加序列号,则会有警告信息,但是不是错误信息
一般选择Add generated serial version ID会生成一个在项目中永不重复的的序列版本编号 序列版本号可以不用添加,这个序列版本号是一种序列化和反序列化中快速识别类型的简单方法,比不加序列号的识 别效率高。引入的功能是如果版本号不对应,不会进行类型识别,而是直接报异常InvalidClassException

5、一般针对敏感数据不应该进行序列化操作,针对不需要进行序列操作的属性可以添加一个关键字transient,表 示该属性不参与序列化和反序列化操作

6、读文件的判断:读取文件时可以通过EOFException异常来判断文件读取结束

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值