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

相关推荐
技术无疆41 分钟前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
(⊙o⊙)~哦2 小时前
JavaScript substring() 方法
前端
无心使然云中漫步2 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者2 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js
高兴就好(石3 小时前
DB-GPT部署和试用
数据库·gpt
xnian_3 小时前
解决ruoyi-vue-pro-master框架引入报错,启动报错问题
前端·javascript·vue.js
这孩子叫逆3 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0663 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下4 小时前
Redis的配置与优化
数据库·redis·缓存
麒麟而非淇淋4 小时前
AJAX 入门 day1
前端·javascript·ajax