08. I/O流

  1. 什么是流?

    流,是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道。

    一个流是一个输入设备或者输出设备的抽象表示,,可以写数据到流中,也可以从流中读数据,可以把流想象为程序中流进或流出的一个字节序列。

  2. 流的分类

    1. 按照流的流向进行分类:

      1. 输入流:只能从中读取数据,而不能向其中写入数据。

        主要由InputStream和Reader作为基类

      2. 输出流:只能向其中写入数据,而不能从中读取数据。

        主要由OutputStream和Writer作为基类

    2. 按照所操作的数据单元的不同分类:

      1. 字节流:

        字节流操作的最小数据单元为8位字节

      2. 字符流:

        字符流操作的最小数据单位为16位字符

      字节流和字符流的区分非常简单,字节流建议用于二进制数据(如图片),而字符流用于文本,他们的用法几乎是一样的。

  3. 使用字节流读取文本文件

    1. 字节输入流 InputStream 类

      字节输入流的作用就是将文件中的数据输入到内存中,它提供了一系列和读取数据有关的方法:

      方法名称 说明
      int read() 读取一个字节数据
      int read(byte[] b) 将数据读取到字节数组中
      int read(byte[] b, int off, int len) 从输入流中读取最多len长度的字节,保存到字节数组b中,保存的位置从off开始
      void close() 关闭输入流
      int available() 返回输入流读取的估计字节数
  4. 使用字节流写文本文件

    1. 字节输出流 OutputStream 类

      字节输出流的作用就是把内存中的数据输出到文件中,它提供了一系列向文件中写数据的有关方法:

      方法名称 说明
      void write(int c) 写入一个字节
      void write(byte[] b) 写入数组b所有字节
      void write(byte[] b, int off, int len) 将字节数组中从off位置开始,长度为len的字节数据输出到输出流中
      void close() 关闭输出流
  5. 使用字符流读取文本文件

    1. 字符输入流 FileReader 类

      Reader类是读取字符流的抽象类,它提供了常用的方法:

      方法名称 说明
      int read() 从输入流中读取单个字符
      int read(char[] c) 从输入流中读取c.length长度的字符,保存到字符数组c中,返回实际读取的字符数
      read(char[] c, int off, int len) 从输入流中读取最多len的长度字符,保存到字符数组c中,保存的位置从off位置开始,返回实际读取的字符的长度
      void close() 关闭流
  6. 使用字符流写入文本文件

    1. 字符输出流 Writer 类

      Writer 类是向文件写入数据的字符流,它提供了常用的方法:

      方法名称 说明
      writer(String str) 将str字符串里包含的字符输出到指定的输出流中
      writer(String str, int off, int len) 将str字符串里从off位置开始长度为len的字符输出到流中
      close() 关闭流
      flush() 刷新流

序列化

序列化就是将对象的状态存储到文件中的过程,在序列化过程中,会将对象的共有成员,私有成员,包括类名,转换为字节流, 然后再把字节流写入数据流,存到文件中

实现序列化大概步骤为:

  1. 创建一个对象输出流 ObjectOutStream ,它可以包装一个其他类型的输出流,如文件输出流,FileOutStream,例如以下代码:

    1
    ObjectOutputStream oos = new ObjectOutputStream(New FileOutputStream("文件路径"));
  2. 通过对象输出流的writeObject()方法写对象,也就是输出可序列化对象

    1
    oos.writeObject(对象);

反序列化

反序列化是从文件读取数据并重新构建为对象,主要分为两步:

  1. 创建对象输入流 ObjectInputStream ,它可包装一个其他类型的输入流,如文件输入流 FileInputStream
  2. 通过对象输入流的readObjct()方法读取对象,该方法返回一个object类型的对象

反射机制

java 反射机制是java的特性之一,反射机制是构建框架技术的基础所在

java反射机制是指在运行过程中,动态获取信息以及动态调用对象方法的功能

java反射机制有3个动态特性:

  1. 运行时生成对象实例
  2. 运行期间调用方法
  3. 运行时更改属性

反射常用API

  1. Class 类:反射的核心类,可以获取类的属性,方法等内容信息
  2. Field 类:表示类的属性,可以获取和设置类中的属性
  3. Method 类:表示类的方法,可以获取类中方法的信息,或者执行方法
  4. Constructor 类:表示类的构造方法

使用java反射机制的基本步骤:

  1. 导入java.lang.reflect.*
  2. 获得需要操作的类的class对象
  3. 调用class对象的方法,获取field,method等对象
  4. 使用反射api进行操作