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

相关推荐
小鑫记得努力7 分钟前
Java类和对象(下篇)
java
binishuaio11 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE13 分钟前
【Java SE】StringBuffer
java·开发语言
老友@13 分钟前
aspose如何获取PPT放映页“切换”的“持续时间”值
java·powerpoint·aspose
superman超哥21 分钟前
04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索
数据库·oracle·性能优化·dba
wrx繁星点点28 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
Upaaui31 分钟前
Aop+自定义注解实现数据字典映射
java
zzzgd81631 分钟前
easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头
java·excel·表格·easyexcel·导入导出
友善的鸡蛋32 分钟前
解决:使用EasyExcel导入Excel模板时出现数据导入不进去的问题
java·easyexcel·excel导入
星沁城33 分钟前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵