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.工具包

相关推荐
梦想平凡14 小时前
百游棋牌源代码开发搭建教程(二):PostgreSQL安装、业务表创建与版本化迁移
数据库·游戏·postgresql
野生技术架构师14 小时前
从向量检索到混合搜索优化:Spring AI 2.0.1 + pgvector RAG 实战
java·人工智能·spring
企业解惑小助手14 小时前
如何禁止文字复制?企业文档防复制项目需求拆解方案
运维·数据库·安全
蓝速科技14 小时前
酒店门店 AI 数字人前台场景适配与落地指南
大数据·运维·数据结构·数据库·人工智能·科技
IT枫斗者枫哥14 小时前
CompletableFuture 超时了,任务还在跑?用三个实验分清超时与取消
java
chushiyunen14 小时前
mockito笔记
java·开发语言·笔记
Doubbbbbbble云14 小时前
基于空间局部性的排序算法性能重构思路4
java·重构·排序算法
oradh15 小时前
Oracle UNDO 数据文件丢失处理(案例一)
数据库·oracle
richard_first15 小时前
Transformer与大语言模型:第18章 向量数据库
数据库·人工智能·自然语言处理·transformer·embedding
计算机魔术师15 小时前
Beren Millidge、John Schulman、Charlie O'Neill 对谈递归自我改进离我们还有多远
前端