Java中的IO流
Java IO流基本概念
-
流的基本概念:
- 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象
- 数据在设备间的传输称为流
-
流的本质是数据传输:
- 根据数据传输的特性将流抽象为各种类,方便更直观地进行数据操作
Java IO流结构
-
Java中的IO流结构:
- - 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中的IO流是极其对称的,特殊的几个类如下:
-
LineNumberInputStream:
- 主要完成从流中读取数据时,会得到相应的行号
- 分行的时机以及分行的位置是由该类主动确定的,并不是在原始中有这样一个行号
- 在输出部分没有对应的部分,可以自定义建立一个LineNumberOutputStream,在最初写入时会有一个基准的行号,以后每次遇到换行时会在下一行添加一个行号
-
PushbackInputStream:
- 主要完成查看最后一个字节,如果不符合要求就放入缓冲区
- 主要应用在编译器的语法,词法分析部分
- 输出部分的BufferedOutputStream几乎实现相近的功能
-
SequenceInputStream:
- 一个工具类.将两个或者多个输入流当成一个输入流一次读取
- 完全可以从IO包中去除,完全不会影响IO包结构,基于装饰器Decorator模式
-
PrintStream:
- 一个辅助工具.主要可以向其余输出流或者FileInputStream写入数据
- 本身内部实现是带缓冲的
- 本质上是对其余流的综合运用的一个工具
-
LineNumberInputStream:
字符输入流-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中的类使用一致
字符流的输入和输出的对应关系
在这里插入图片描述
字符流和字节流的转换
-
转换流的特点:
- 转换流是字符流和字节流之间的桥梁
- 转换流可以对读取到的字节数据经过指定编码转换成字符
- 转换流可以对读取到的字符数据经过指定编码转换成字节
-
转换流的使用场景:
- 当字节和字符之间有转换动作时
- 流操作的数据需要编码或者解码时
-
转换流的具体对象体现:
- InputStreamReader: 字节到字符的桥梁
-
OutputStreamWriter: 字符到字节的桥梁
- 这两个流对象是字符体系中的成员,具有转换作用
- 这两个流对象本身又是字符流,所以在构造时需要传入字节流对象
File类
-
File类:
- 对文件系统中的文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹
-
File类保存文件或目录的各种元数据信息:
- 文件名
- 文件长度
- 最后修改时间
- 是否可读
-
File类中包括对文件和文件夹的操作方法:
- 获取当前文件的路径名
- 判断指定文件是否存在
- 获取当前目录中的文件列表
- 创建,删除文件和目录
RandomAccessFile类
-
RandomAccessFile:
- RandomAccessFile类并不是流体系的组成部分
- RandomAccessFile封装了字节流,同时还封装了一个缓冲区,缓冲区是一个字符数组,通过内部指针来操作字符数组中的数据
-
RandomAccessFile类的特点:
-
只能操作文件. 所以构造函数接收两种类型的参数:
- 字符串文件路径
- File对象
- 既可以对文件进行读操作, 也可以进行写操作. 在进行对象实例化时可指定操作模式
- r
- rw
-
只能操作文件. 所以构造函数接收两种类型的参数:
-
RandomAccessFile实例化:
- 实例化时,如果操作的文件不存在,会自动创建
- 如果文件存在,写数据未指定位置,默认会从头开始写,这样就会覆盖原有的内容
- 可用于多线程下多个线程同时写数据到文件
[图片上传中...(86edb345a33443b8842604f883351a96~tplv-k3u1fbpfcp-zoom-crop-mark-1304-1304-1304-734.image.jpg-92a196-1630760267224-0)]