IO
Java的输入、输出系统,用于传输数据。
一个流可以理解为一个数据的序列。
分类
按数据流的方向分为 输入流、输出流
I:输入流表示从一个源读取数据,O:输出流表示向一个目标写数据。
流以其中最小数据单元区分为字符流和字节流:
字节流: 1 byte(8 bit位)为最小数据单元。
字符流: 2 byte(1 char,16 bit位)为最小数据单元。(Java 中的字符是 Unicode 编码,一个字符占用两个字节。)

以是否直接处理数据区分为节点流和处理流
节点流是真正直接处理数据的;处理流是装饰加工节点流的。
节点流:
| 文件流 | FileInputStream,FileOutputStrean,FileReader,FileWriter |
直接操作文件,直接与 OS 底层交互。因此他们被称为节点流 注意:使用这几个流的对象之后,需要关闭流对象,因为 java 垃圾回收器不会主动回收。不过在 Java7 之后,可以在 try() 括号中打开流,最后程序会自动关闭流对象,不再需要显示地 close。 |
| 数组流 | ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter | 对数组进行处理的节点流 |
| 字符串流 | StringReader,StringWriter | StringReader 能从 String 中读取数据并保存到 char 数组 |
| 管道流 | PipedInputStream,PipedOutputStream,PipedReader,PipedWrite | 对管道进行处理的节点流 |
处理流
处理流是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如 BufferedReader。
处理流的构造方法总是要带一个其他的流对象做参数。
常用处理流(通过关闭处理流里面的节点流来关闭处理流)
| 缓冲流 | BufferedImputStrean,BufferedOutputStream,BufferedReader ,BufferedWriter |
需要父类作为参数构造,增加缓冲功能,避免频繁读写硬盘,可以初始化缓冲数据的大小 由于缓冲功能,写数据时需要使用 flush 方法或close才能将数据写出 BufferedReader 提供一个 readLine( ) 方法可以读取一行,而 FileInputStream 和 FileReader 只能读取一个字节或者一个字符,因此 BufferedReader 也被称为行读取器。 |
| 转换流 | InputStreamReader,OutputStreamWriter | 需要 InputStream 或 OutputStream 作为参数,实现从字节流到字符流的转换,我们经常在读取键盘输入(System.in)或网络通信的时候,需要使用这两个类。 |
| 数据流 | DataInputStream,DataOutputStream | 提供将基础数据类型写入到文件中,或者读取出来的功能 |
IO流的特性
| 先进先出 | 最先写入输出流的数据最先被输入流读取到 |
| 顺序存取 |
可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。 (RandomAccessFile可以从文件的任意位置进行存取(输入输出)操作) |
| 只读或只写 |
每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。 在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。 |
设计模式
Decorator(装饰者)模式,按功能划分Stream
常用
| 5类 | |
| InputStream(二进制格式操作) | 抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征 |
| OutputStream(二进制格式操作) | 抽象类,基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征 |
| Reader(文件格式操作) | 抽象类,基于字符的输入操作 |
| Writer(文件格式操作) | 抽象类,基于字符的输出操作 |
| File(文件特征与管理) |
是通过文件对象操作文件系统中文件以及文件夹的类。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、 获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。 RandomAccessFile(随机文件操作):一个独立的类,直接继承至Object。 可以从文件的任意位置进行存取(输入输出)操作 |
| 1接口 | |
| Serializable(序列化) | 数据要存储到硬盘中就要序列化,从硬盘中取出为反序列化 |
流的关闭
一个流的创建,不止会创建出一个相应类的实例对象,还会占用相关的系统资源。
当流对象使用完毕,在内存中的实例对象会被java垃圾回收器回收,但是,系统资源不会被释放,所以需要在使用完毕后,
需要显示的调用流的close()方法来释放流。
关闭的方式
try-catch-finally
byte[] bytes = {36, 37, 38, 39, 40};
FileOutputStream fileOut = new FileOutputStream("test.txt");
try {
fileOut.write(bytes);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
此方式,如果打开多个资源,那么finally中会嵌套finally来关闭多个资源,还会导致异常屏蔽问题
Java 1.7开始, Throwable 类新增了 addSuppressed 方法,支持将一个异常附加到另一个异常身上,来避免异常屏蔽。
try-with-resources
jdk1.7引入的语法糖,使用此方式的资源必须先实现AutoCloseable接口,其中包含了单个返回void的close方法。
byte[] bytes = {36, 37, 38, 39, 40};
try (FileOutputStream fileOut = new FileOutputStream("test.txt")) {
fileOut.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
参考引用:
https://www.cnblogs.com/CQqf/p/10795656.html
https://blog.csdn.net/sinat_37064286/article/details/86537354
菜鸟
posted on
浙公网安备 33010602011771号