Java中的输入和输出流

Java中的IO流归纳总结

  • Java IO流基本概念
  • Java IO流结构
  • Java IO流分类
      • 字节流和字符流
      • 输入流和输出流
  • Java IO流对象
      • 输入字节流-InputStream
      • 输出字节流-OutputStream
      • 字节流的输入和输出的对应关系
      • 字符输入流-Reader
      • 字符输出流-Writer
      • 字符流的输入和输出的对应关系
      • 字符流和字节流的转换
      • File类
      • RandomAccessFile类

Java IO流基本概念

  • 流的基本概念:
    • 流是一组有顺序的,有起点和终点字节集合,是对数据传输的总称或抽象
    • 数据在设备间的传输称为流
  • 流的本质是数据传输:
    • 根据数据传输的特性将流抽象为各种类,方便更直观地进行数据操作

Java IO流结构

  • Java中的IO流结构:
    Java中的输入和输出流_第1张图片
  • Java中的常用的IO流操作相关的类:
描述
File 文件类
RandomAccessFile 随机存取文件类
InputStream 字节输入流
OutputStream 字节输入流
Reader 字符输入流
Writer 字符输出流

Java IO流分类

  • 根据处理数据类型的不同分为:
    • 字符流
    • 字节流
  • 根据数据流向的不同分为:
    • 输入流
    • 输出流

字节流和字符流

  • 字符流: 根据数据编码的不同,对字符进行高效操作的流对象
  • 字符流的本质: 基于字节流读取时,查询指定的码表
  • 字节流和字符流的区别:
    • 读写单位不同:
      • 字节流以8 bit的字节为单位
      • 字符流以字符为单位,根据码表映射字符,一次可能读多个字节
    • 处理对象不同:
      • 字节流可以处理所有类型的数据
      • 字符流只能处理字符流类型的数据
  • 结论:
    • 只要处理纯文本数据,优先考虑使用字符流
    • 处理纯文本以外的数据使用字节流

输入流和输出流

  • 要根据待传输数据的不同特性使用不同的流:
    • 输入流只能进行读操作
    • 输出流只能进行写操作

Java IO流对象

输入字节流-InputStream

  • InputStream:
    • 是一个抽象类
    • 所有的输入字节流的父类
  • InputStream三种基本的介质流:
    • ByteArrayInputStream: 从Byte数组中读取数据
    • StringBufferInputStream: 从StringBuffer中读取数据
    • FileInputStream: 从本地文件中读取数据
  • PipedInputStream: 从与其余线程共用的管道中读取数据
  • 装饰流: 装饰器模式中的重要角色
    • ObjectInputStream和所有FileInputStream的子类都是装饰流

输出字节流-OutputStream

  • OutputStream:
    • 是一个抽象类
    • 是所有输出字节流的父类
  • OutputStream两种基本的介质流:
    • ByteArrayOutputStream: 向Byte数组中写入数据
    • FileOutputStream: 向本地文件中写入数据
  • PipedOutputStream: 向其余线程共用的管道中写入数据
  • 装饰流: 装饰模式中的重要角色
    • ObjectOutputStream和所有FileOutputStream的子类都是装饰流

字节流的输入和输出的对应关系

Java中的输入和输出流_第2张图片
蓝色的为主要的对应部分
红色的为不对应部分
紫色的虚线部分代表这些流一般要搭配使用

  • Java中的IO流是极其对称的,特殊的几个类如下:
    • LineNumberInputStream:
      • 主要完成从流中读取数据时,会得到相应的行号
      • 分行的时机以及分行的位置是由该类主动确定的,并不是在原始中有这样一个行号
      • 在输出部分没有对应的部分,可以自定义建立一个LineNumberOutputStream,在最初写入时会有一个基准的行号,以后每次遇到换行时会在下一行添加一个行号
    • PushbackInputStream:
      • 主要完成查看最后一个字节,如果不符合要求就放入缓冲区
      • 主要应用在编译器的语法,词法分析部分
      • 输出部分的BufferedOutputStream几乎实现相近的功能
    • SequenceInputStream:
      • 一个工具类.将两个或者多个输入流当成一个输入流一次读取
      • 完全可以从IO包中去除,完全不会影响IO包结构,基于装饰器Decorator模式
    • PrintStream:
      • 一个辅助工具.主要可以向其余输出流或者FileInputStream写入数据
      • 本身内部实现是带缓冲的
      • 本质上是对其余流的综合运用的一个工具

字符输入流-Reader

  • Reader:
    • 是一个抽象类
    • 所有输入字符流的父类
  • Reader两种基本的介质流:
    • CharReader: 从Char数组中读取数据
    • StringReader: 从String中读取数据
  • BufferedReader: 是一个装饰器,和本身的子类负责装饰Reader对象,提供缓冲功能
  • FilterReader:
    • 所有自定义具体装饰流的父类
    • 子类PushbackReader对Reader对象进行装饰,会增加一个行号
  • InputStreamReader:
    • 是一个连接字节流和字符流的桥梁,将字节流转变为字符流
    • 子类FileReader是一个连接字节流和字符流,将字节流转变为字符流常用的工具类.使用了将FileInputStream转变为Reader的方法
  • Reader中的各个类的用途和使用方法基本和InputStream中的类使用一致

字符输出流-Writer

  • Writer:
    • 是一个抽象类
    • 所有输出字符流的父类
  • Writer两种基本的介质流:
    • CharArrayWriter: 向Char数组中写入数据
    • StringArrayWriter: 向String中写入数据
  • PipedWriter: 向其余线程共用的管道中写入数据
  • BufferedWriter: 是一个装饰器,为Writer提供缓冲功能
  • PrintWriter:
    • PrintWriter和PrintStream极其相似
    • 一个辅助工具.主要可以向其余输出流或者FileReader写入数据
    • 内部实现是带缓冲的
    • 本质上是对其余流的综合运用的一个工具
  • OutputStreamWriter:
    • 是OutputStream到Writer转换的桥梁
    • 子类FileWriter就是一个实现该功能的具体类
  • Writer的各个类的用途和使用方法基本和OutputStream中的类使用一致

字符流的输入和输出的对应关系

Java中的输入和输出流_第3张图片

字符流和字节流的转换

  • 转换流的特点:
    • 转换流是字符流和字节流之间的桥梁
    • 转换流可以对读取到的字节数据经过指定编码转换成字符
    • 转换流可以对读取到的字符数据经过指定编码转换成字节
  • 转换流的使用场景:
    • 当字节和字符之间有转换动作时
    • 流操作的数据需要编码或者解码时
  • 转换流的具体对象体现:
    • InputStreamReader: 字节到字符的桥梁
    • OutputStreamWriter: 字符到字节的桥梁
      • 这两个流对象是字符体系中的成员,具有转换作用
      • 这两个流对象本身又是字符流,所以在构造时需要传入字节流对象

File类

  • File类:
    • 对文件系统中的文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹
    • File类保存文件或目录的各种元数据信息:
      • 文件名
      • 文件长度
      • 最后修改时间
      • 是否可读
    • File类中包括对文件和文件夹的操作方法:
      • 获取当前文件的路径名
      • 判断指定文件是否存在
      • 获取当前目录中的文件列表
      • 创建,删除文件和目录

RandomAccessFile类

  • RandomAccessFile:
    • RandomAccessFile类并不是流体系的组成部分
    • RandomAccessFile封装了字节流,同时还封装了一个缓冲区,缓冲区是一个字符数组,通过内部指针来操作字符数组中的数据
  • RandomAccessFile类的特点:
    • 只能操作文件. 所以构造函数接收两种类型的参数:
      • 字符串文件路径
      • File对象
    • 既可以对文件进行读操作, 也可以进行写操作. 在进行对象实例化时可指定操作模式
      • r
      • rw
  • RandomAccessFile实例化:
    • 实例化时,如果操作的文件不存在,会自动创建
    • 如果文件存在,写数据未指定位置,默认会从头开始写,这样就会覆盖原有的内容
    • 可用于多线程下多个线程同时写数据到文件

你可能感兴趣的:(Java)