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 2021-03-20 14:37  一计  阅读(132)  评论(0)    收藏  举报