IO流
概念
I -- input 输入,数据流向程序(读文件)
O -- output 输出,数据流出数据(写入文件)
流 -- 一点一点的像水流一样去传输数据
注意:站在程序的角度去看待是输入还是输出
分类
按照方向分类:输入流、输出流
按照单位分流:字节流、字符流
按照功能分类:基础流/节点流、处理流
注意:new 处理流(new 基础流) -- 装饰者模型 -- 处理流对象中往往包含了基础对象流,在基础流的基础上拓展了额外的功能,使得流的效率更高,工作中一般使用处理流。
字节流
应用场景:操作二进制数据(音频、视频、图片)
abstract class InputStream 字节输入流的基类(抽象类)
abstract class OutputStream 字节输出流的基类(抽象类)
class FileInputStream extends InputStream --文件字节输入流
class FileOutputStream extends OutputStream --文件字节输出流
class FilterInputStream extends InputStream --过滤器字节输入流
class FilterOutputStream extentds OutputStream --过滤器字节输出流
class BufferedInputStream extends FilterInputStream --带缓冲区的字节输入流
class BufferedOutputStream extends FilterOutputStream --带缓冲区的字节输出流
//默认缓冲区大小:9182字节
字符流
应用场景:操作纯文本数据
注:字符流 = 字节流 + 编译器
编译器:编译器可以识别中文字符和非中文字符,非中文字符获取一个字节(一个字节=一个字符),然后编译器根据编码格式获取中文字符对应的字节数(GBK获取两个字节,UTF-8获取三个字节)
abstract class Reader --字符输入流的基类(抽象类)
abstract class Writer --字符输出流的基类(抽象类)
class InputStreamReader extends Reader --字符输入转换流
class OutputStreamWriter extends Writer --字符输出转换流
//特点:将字节流转换为字符流,字符转换流是字节流和字符流的桥梁
class FileReader extends InputStreamReader --文件字符输入流
class FileWriter extends OutputStreamWriter --文件输出流
class BufferedReader extends Reader --带有缓冲区的字符输入流
class BufferedWriter extents Writer --带有缓冲区的字符输出流
//默认缓冲区大小:8192字符 -- new char[8192]
各种流
对象流
应用:服务器崩掉时,将对象流文件传给另一个服务器,另一个服务器加载对象流文件,继续为客户端提供服务
class ObjectInputStream --对象输入流
class ObjectOutputStream --对象输出流
//该流可以将对象写入文件,也可以读取文件中的对象
序列化/钝化:将程序中的对象写入到文件中
反序列化/活化:将文件中的对象读取到程序中
注:
- 写入数据后,打开文件我们是看不懂的,这个不重要,重要的是取出来能用
- 对象所属的类必须实现序列化接口 – Serializable
- Serializable接口,没有让我们实现任何的抽象方法,这种接口称之为标记型接口
- 添加序列化ID --private static final long serialVersionUID = -6885984330342979506L;
- transient关键字修饰在之后,该属性不会随着对象被写入到文件
内存流
class ByteArrayInputStream --内存输入流
class ByteArrayOutputStream --内存输出流
注:
- 内存流是程序到内存的通道,之前的流是程序到硬盘的通道
- 内存流是关闭不掉的,我们没有权限关闭内存的通道
打印流
class PrintStream -- 字节打印流
class PrintWriter -- 字符打印流
//注:方向就是程序到文件(本质意义上是一个输出流)
PrintStream vs PrintWriter
相同点:底层都是讲文件字节输出流->字符输出转换流->带有缓冲区的字符输出流
不同点:
PrintStream 只能将字节流转换为打印流
PrintWriter 可以将字节流和字符流转换为打印流
打印流拓展 - 重定向
理解:重新定义系统标准输入流、输出流、错误输出流的方向
重新定义系统标准输入流的方向
System.in – 系统标准输入流
方向:控制台 -> 程序
重定向:System.setIn(字节输入流)
方向:文件 -> 程序
重新定义系统标准输出流的方向
System.out – 系统标准输出流
方向:程序 -> 控制台
重定向:System.setOut(字节打印流)
方向:程序 -> 文件
重新定义系统标准的错误输出流
System.err – 系统标准的错误输出流
方向:程序 -> 控制台
重定向:System.setErr(字节打印流)
方向:程序 -> 文件
随机访问流 - RandomAccessFile
理解:该流认为文件是一个大型的byte数组。该流有一个隐藏的指针(下标),指针从0开始(也可以设置指针的位置),可以从指针的位置开始读取或者写入
模式: r - 读, rw - 写
注:该流和上述的流没有继承、实现关系