0
点赞
收藏
分享

微信扫一扫

Java中的输入和输出流

晗韩不普通 2022-03-12 阅读 82



Java中的IO流归纳总结


  • ​​Java IO流基本概念​​
  • ​​Java IO流结构​​
  • ​​Java IO流分类​​

  • ​​字节流和字符流​​
  • ​​输入流和输出流​​

  • ​​Java IO流对象​​

  • ​​输入字节流-InputStream​​
  • ​​输出字节流-OutputStream​​
  • ​​字节流的输入和输出的对应关系​​
  • ​​字符输入流-Reader​​
  • ​​字符输出流-Writer​​
  • ​​字符流的输入和输出的对应关系​​
  • ​​字符流和字节流的转换​​
  • ​​File类​​
  • ​​RandomAccessFile类​​



Java IO流基本概念


  • 流的基本概念:

  • 流是一组​有顺序​的,​有起点和终点​的​字节集合​,是对​数据传输的总称或抽象
  • 数据在设备间的传输​称为流

  • 流的本质是数据传输:
  • 根据数据传输的特性将流抽象为各种类,方便更直观地进行数据操作

Java IO流结构


  • Java中的IO流结构:Java中的输入和输出流_字节流
  • 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中的输入和输出流_java_02

蓝色的为主要的对应部分

红色的为不对应部分

紫色的虚线部分代表这些流一般要搭配使用

  • 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中的输入和输出流_字节流_03

字符流和字节流的转换


  • 转换流的特点:

  • 转换流是字符流和字节流之间的桥梁
  • 转换流可以对读取到的字节数据经过指定编码转换成字符
  • 转换流可以对读取到的字符数据经过指定编码转换成字节

  • 转换流的使用场景:

  • 当字节和字符之间有转换动作时
  • 流操作的数据需要编码或者解码时

  • 转换流的具体对象体现:

  • InputStreamReader:​ 字节到字符的桥梁
  • OutputStreamWriter:​ 字符到字节的桥梁

  • 这两个流对象是字符体系中的成员,具有转换作用
  • 这两个流对象本身又是字符流,所以在构造时需要传入字节流对象



File类

  • File类:

  • 对文件系统中的文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹
  • File类保存文件或目录的各种元数据信息:

  • 文件名
  • 文件长度
  • 最后修改时间
  • 是否可读

  • File类中包括对文件和文件夹的操作方法:

  • 获取当前文件的路径名
  • 判断指定文件是否存在
  • 获取当前目录中的文件列表
  • 创建,删除文件和目录


RandomAccessFile类


  • RandomAccessFile:

  • RandomAccessFile类并不是流体系的组成部分
  • RandomAccessFile封装了字节流,同时还封装了一个缓冲区,缓冲区是一个字符数组,通过内部指针来操作字符数组中的数据

  • RandomAccessFile类的特点:

  • 只能操作文件.​ 所以构造函数接收两种类型的参数:

  • 字符串文件路径
  • File对象

  • 既可以对文件进行​读操作,​ 也可以进行​写操作.​ 在进行对象实例化时可指定操作模式

  • r
  • rw


  • RandomAccessFile实例化:

  • 实例化时,如果操作的文件不存在,会自动创建
  • 如果文件存在,写数据未指定位置,默认会从头开始写,这样就会覆盖原有的内容
  • 可用于多线程下多个线程同时写数据到文件



举报

相关推荐

0 条评论