14.其他流(下篇)

1. IO流的体系结构

  • IO流的使用原则:随用随创建,什么时候不用什么时候关闭
  • 1.1 io流的体系结构图
  • 1.2缓冲流的分类
    缓冲流,也叫高效流,是对4个基本的FileXxx流的增强

    • 字节缓冲流:BufferedInputStream,BufferedOutputStream
    • 字符缓冲流:BufferedReader,BufferedWriter
    • 缓冲流的基本原理:在创建流对象时,会创建一个内置的默认长度为8192字节/字符的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率

2.字节缓冲流

  • 2.1构造方法

    • public BufferedInputStream(InputStream in)
      创建一个 新的缓冲输入流。
    • public BufferedOutputStream(OutputStream out)
      创建一个新的缓冲输出流。
  • 2.2注意:只需要关闭缓冲流即可,基本流的关闭已经被包装好了

3.字符缓冲流

  • 3.1构造方法

    • public BufferedReader(Reader in)
      创建一个 新的缓冲输入流
    • public BufferedWriter(Writer out)
      创建一个新的缓冲输出流
  • 3.2特有方法

    • BufferedReader:public String readLine()
      读一行文字,如果没有数据返回Null
    • BufferedWriter:public void newLine()
      写一行行分隔符,由系统属性定义符号。 (跨平台的换行)

4.转换流

  • 4.2转换流的作用

    • 指定字符集读取数据(JDK11之后被淘汰)
      代替的构造方法:
      FileReader(String fileName,Charset BM)
      FileWriter(String fileName,Charset BM)
      注意:Charset是一个类,可以调用此类中的Charset.forName(String BM)
    • 字节流想要使用字符流中的方法
  • 4.3InputStreamReader类

    • 介绍:
      • 转换流java.io.InputStreamReader,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。
    • 构造方法:

      • InputStreamReader(InputStream in)
        创建一个使用默认字符集的字符流
      • InputStreamReader(InputStream in, String charsetName)
        创建一个指定字符集的字符流
  • 4.4OutputStreamWriter类

    • 介绍:
      • 转换流java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。
    • 构造方法:

      • OutputStreamWriter(OutputStream in)
        创建一个使用默认字符集的字符流
      • OutputStreamWriter(OutputStream in, String charsetName)
        创建一个指定字符集的字符流
  • 4.5转换流理解图解

    • 转换流是字节与字符间的桥梁

5.序列化

  • 5.1概述

    • Java 提供了一种对象**序列化**的机制。用一个字节序列可以表示一个对象,该字节序列包含该`对象的数据`、`对象的类型`和`对象中存储的属性`等信息。字节序列写出到文件之后,相当于文件中**持久保存**了一个对象的信息。
    • 反之,该字节序列还可以从文件中读取回来,重构对象,对它进行**反序列化**。`对象的数据`、`对象的类型`和`对象中存储的数据`信息,都可以用来在内存中创建对象。
    • 图解
  • 5.2ObjectOutputStream类
    java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。

    • 构造方法:public ObjectOutputStream(OutputStream out)
      创建一个指定OutputStream的ObjectOutputStream
    • 写出对象方法:public final void writeObject (Object obj)
      将指定的对象写出
    • 序列化操作条件

      • 该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。
      • 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。
  • 5.3ObjectInputStream类
    ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。

    • 构造方法:public ObjectInputStream(InputStream in)
      创建一个指定InputStream的ObjectInputStream
    • 读取对象方法:public final Object readObject ()
      读取一个对象
    • 注意:对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个 ClassNotFoundException 异常
    • 注意:Serializable 接口给需要序列化的类,提供了一个序列版本号。serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。
      private static final long serialVersionUID = 1L;
  • 5.4细节汇总

      1. 需要让JavaBean类实现Serialzable接口
      1. 文件中的序列化数据修改后无法再次读取
      1. 修改JavaBean后,再次反序列化会抛出InvalidClassException异常,解决方案:添加序列号
      1. 给成员变量添加transient关键字修饰,该关键字标记的成员变量不参与序列化过程。
      1. 当不确定有多少对象需要序列化,使用集合,将集合序列化。

6.打印流

  • 平时我们在控制台打印输出,是调用print方法和println方法完成的,这两个方法都来自于java.io.PrintStream类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。

  • 6.1分类

    • 字节打印流:PrintStream
    • 字符打印流:PrintWriter
  • 6.2特点

    • 打印流只操作文件目的地,不操作数据源
    • 特有的写出方法可以实现数据原样写出
    • 特有的写出方法,可以实现自动刷新,自动换行
  • 6.3字节打印流

    • 构造方法
    • 成员方法
  • 6.4字符打印流

    • 构造方法
    • 成员方法
  • 6.5改变打印流的流向

    • 打印流的流向

7.压缩流与解压流

8.工具包

相关推荐
雯0609~10 分钟前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存
℘团子এ13 分钟前
vue3中如何上传文件到腾讯云的桶(cosbrowser)
前端·javascript·腾讯云
xmh-sxh-131413 分钟前
jdk各个版本介绍
java
学习前端的小z18 分钟前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
天天扭码33 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶33 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺38 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
彭世瑜42 分钟前
ts: TypeScript跳过检查/忽略类型检查
前端·javascript·typescript
FØund40443 分钟前
antd form.setFieldsValue问题总结
前端·react.js·typescript·html
Backstroke fish44 分钟前
Token刷新机制
前端·javascript·vue.js·typescript·vue