- IO流
- IO流使用场景
- 什么是IO流
- 常用的IO流
- 字节流
- 字符流
- 缓冲流
- BIO、NIO、AIO的区别
IO流
IO流使用场景
- 如果操作的是纯文本文件,优先使用字符流
- 如果操作的是图片、视频、音频等二进制文件。优先使用字节流
- 如果不确定文件类型,优先使用字节流。字节流是万能的流
什么是IO流
IO流就是用来处理输入和输出
操作的抽象概念。它可以将数据从一个地方(输入源)传输到另一个地方(输出源),用于设备之间的数据传输
就比如姐姐结婚,而你是个婚礼策划师,你就需要调节各个环节和参与者,确保婚礼顺利进行。在婚礼中,你需要收集新娘、新郎、家人、朋友和来宾的信息、需求和意见,这些信息就像输入流一样,提供给你使用,然后作为婚礼策划师的你,需要将计划、安排和决策输出给各个参与者,例如新娘什么时候进场、提供给摄影师拍摄的时间、产地的布置等等,这些就像是输出流一样,输出给各个参与者
常用的IO流
最常用的就三个 字节流、字符流和缓冲流
字节流
传输过程中,传输数据的最基本单位是字节的流。
字节流用于处理以字节为单位的二进制文件
(如音乐、图片等)
字节输入流InputStream
主要方法:
read()
:从此输入流中读取一个数据字节。read(byte[] b)
:从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。read(byte[] b, int off, int len)
:从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。close()
:关闭此输入流并释放与该流关联的所有系统资源。
字节输出流OutputStream
主要方法:
write(byte[] b)
:将 b.length 个字节从指定 byte 数组写入此文件输出流中。write(byte[] b, int off, int len)
:将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输 出流。write(int b)
:将指定字节写入此文件输出流。close()
:关闭此输入流并释放与该流关联的所有系统资源。
字符流
由于字节流操作中文不是特别的方便,所以Java就提供字符流
字符流 = 字节流 + 编码表
传输过程中,传输数据的最基本单位是字符的流。
字符流用于处理以Unicode字符为单位的
文本文件
(如记事本文件等)
字符输入流Reader
主要方法:
read()
:读取单个字符。read(char[] cbuf)
:将字符读入数组。read(char[] cbuf, int off, int len)
: 将字符读入数组的某一部分。read(CharBuffer target)
:试图将字符读入指定的字符缓冲区。flush()
:刷新该流的缓冲。close()
:关闭此流,但要先刷新它。
字符输出流Writer
主要方法:
write(char[] cbuf)
:写入字符数组。write(char[] cbuf, int off, int len)
:写入字符数组的某一部分。write(int c)
:写入单个字符。write(String str)
:写入字符串。write(String str, int off, int len)
:写入字符串的某一部分。flush()
:刷新该流的缓冲。close()
:关闭此流,但要先刷新它。
缓冲流
缓冲流,也叫高效流,是对4个基本的FileXxx流的增强
在标准的输入流(InputStream)和输出流(OutputStream)的基础上,缓冲流提供了额外的缓冲区,可以减少
对底层I/O系统的直接访问
次数,从而提高
读写的效率
。
字符缓冲流两个独特的方法:
BufferedWriter
类newLine()
:写入一个行分隔符。这个方法会自动适配所在系统的行分隔符。BufferedReader
类readLine()
:读取一个文本行。
BIO、NIO、AIO的区别
BIO:Blocking IO 是java中最早的IO模型,它是一种阻塞式IO模型
。在BIO中,每个连接都需要独立的线程来处理,因此它的并发性能比较差。BIO适用于连接数比较小的场景,例如单机版的服务器。
NIO:Non-blocking IO 是BIO的升级,它是一种非阻塞式IO模型
。在NIO中,一个线程可以处理多个连接,因此它的并发性能比较好。NIO适用于连接数比较多的场景,例如高并发的服务器。
AIO:Asynchronous IO 是NIO的升级,它是一种异步式IO模型
。在AIO中,读写操作都是异步的,不需要阻塞线程。AIO适用于连接数比较多且每个连接的数据量比较大的场景,例如文件传输。