字节缓冲流,对象流

字节缓冲流:避免了底层系统的多次调用
    BufferedOutputStream:该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。
    BufferedInputStream:创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次有多个字节。
    构造方法:
    BufferedOutputStream(OutputStream out)
    BufferedInputStream(InputStream input)
注意:
    字节缓冲流仅仅提供缓冲区,真正的读写数据还是依靠基本的字节流对象进行操作
    使用BufferedOutputStream调用writer不在是直接写入到文件,而是写入到缓冲区
    想要把数据写入到文件,有三种方式
                                1.flush
                                2.close
                                3.缓冲区满了自动刷新

编码和解码
    二进制和字母或字符之间的转换规则
    编码:
        byte[] getBytes():使用平台的默认字符编码集将String存储字节数组
        byte[] getBytes(String chareName):使用指定的编码集String存储字节数组
    解码:
        String(byte[] bytes):通过默认字符集解码指定的数组来构造新的String
        String(byte[] bytes,String chareName):通过指定字符集解码指定的数组来构造新的String

    注意:
        编码和解码一定要保证一直,不然会出现乱码问题
        常用编码集GBK和UTF-8
        GBK是把一个字符转换成2个字节
        UTF-8把一个字符转换成3个字节

字符流:专门用来处理文本文件(能看懂的文本文件)
    Read:这个抽象类表示字符输入流的所有类的父类
    Write:这个抽象类表示字符输出流的所有类的父类
    OutputStreamWrite:文件字符输出流(具体的字符输出流实现类)
    OutputStreamWrite(OutputStream out)创建文件字节输出流写入文件

    注意:字符流构造中的参数不是具体的文件路径 而是字节流对象
        说明了字符流才具体的操作文件内容时,本质上还是通过字节流操作

    InputStreamReader:文件字符输入流(具体的字符输入流实现类)
    OutputStreamReader(OutputStream out)创建文件字节输入流读取文件

便捷字符流:
    通过OutputStreamWrite和InputStreamRead构造对象太繁琐,这里可以使用子类FileWrite和FileRead来构建对象
    使用方式:FileWrite(Stirng fileName)

    注意:FileWrite和FileRead不能指定编码表,只能使用默认的编码格式

字符缓冲流:针对于换行符有特殊的操作方式
    读readLine():可以一行读取(不包含换行符)
    写newLine():自动识别换行符,可以忽略具体的换行符号(\n | \r | \r\n)

    BufferedRead:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。 可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。
    BufferedWrite:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。 可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。 
    构造方法:
    BufferedRead(Read in);
    BufferedWrite(Write out);

对象流:
    对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
    这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型,对象中存储的对象详细信息
    字节序列写入到文件之后,相当于文件持久保存了一个对象的信息
    反之,改该字节序列也可以从文件中读取对象信息,称之为反序列化
    对象流:
        对象序列化流:ObjectOutputStream
        对象反序列化流:ObjectInputStream

注意:类想要实现序列化或反序列化必须实现Serializable

Serializable接口中什么都没有,只是一个标识,标识当前类可以进行序列化
    版本号的问题:
        序列化一个对象之后,类文件发生更改,
        会出现InvalidClassException:
        因为当序列化运行时检测到类中的以下问题之一时抛出。 
        类的串行版本与从流中读取的类描述符的类型不匹配 
        该类包含未知的数据类型 
        该类没有可访问的无参数构造函数 
        解决方案:
        在类中增加一个版本标识信息(序列化对象时,会由系统分配的版本标识)
        protected static final long serialVersionUID = 42L;

        成员变量如何不被序列化?
        给该成员加上一个transient关键字修饰,标识了该成员不参与序列化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值