概述:I/O即为输入输出流,它有很多种,按照不同的分类方式可以分为一下三种
- 字节流和字符流
根据流操作的数据单位的不同,可以分为字节流和字符流。字节流是以字节为单位进行数据的读写,每次读写一个或多个字节数据;字符流是以字符为单位进行数据的读写,每次读写一个或 - 输出流和输入流
根据传输的方向的不同,可以分为输入流和输出流。其中输入流只能从流中读取数据,而不能写入数据;输出流只能向流钟写入数据,而不能读取数据。 - 节点流和处理流
根据流的功能不同,可以分为节点流和处理流。节点流称为低级流,是指从一个特定的I/O设备读写数据的流,它只能直接连接数据源,进行数据的读写操作;处理流称为高级流,它用于对一个已存在的节点流进行连接和封装,通过封装后的流来实现流的读写能力。
字节流
概述:所有文件都是以二进制形式存在的,I/O流针对字节的输入输出提供了一系列的流,统称为字节流。
字节流的InputStream和OutputStream,是其顶级父类,所有的字节流都是继承自它们。
字符流
字节流是为了操作字节的,而当操作字符时,我们就应该使用字符流,来实现对字符的操作。
Reader和Writer是字符流的顶级父类,所有的方法都继承自它们。
转换流
转换流主要是用于字节流和字符流之间的转换
InputStreamReader类是Reader的子类,它实现了将字节输入流转换成字符输入流;
OutputStreamWriter类是Writer的子类,它实现了将字节输出流转换成字符输出流;
File类
I/O流只能对文件的内容进行读写操作,但是对文件本身进行一些常规操作是无法实现的,比如创建文件,删除文件,重命名文件等,我们需要通过File类来实现;
RandomAccessFile类
前面所介绍的I/O流共同的特点,就是只能按照数据的先后顺序读取源设备中的数据,或者按照写入的先后顺序向目标顺序写入数据;要是向从文件任意位置开始执行读写操作,字节流和字符流将无法实现;这就就可以通过RandomAccessFile类来实现。
NIO
叙述:在I/O基础上提供了一些处理输入输出的新功能,这些新功能被称为NIO。
与传统的I/O相比,NIO采用内存映射文件方式处理输入输出,它将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了。
在标准I/O中,使用的是字节流和字符流,而在NIO中,使用的是通道(Channel)和缓冲区(Buffer)。
NIO主要有三大核心部分:Buffer、Channel和Selector。
- Buffer可以看成是一个容器,其本质是一个数组缓冲区,读入或写出到Channel中的所有对象都会先放在Buffer中
- Channel是对传统的输入输出的模拟,在NIO中,所有的数据都需要通过通道流的形式传输
- Selector(选择器)用于监听多个通道事件。主要用于多线程的处理
1.Buffer(缓冲器)
Buffer用于和NIO中的Channel进行交互,交互时数据会从Channel读取到Buffer中,或从Buffer写入到Channel中。
创建一个容量为6的CharBuffer对象语句如下:
CharBuffer buffer=CharBuffer.allocate(6);
Buffer中的三个重要概念;分别是capacity(容量)、limit(界限)和position(位置)
capacity:缓冲区的容量表示该Buffer的最大数据容量,即最多可以存储多少数据。缓冲区的容量不能为负数,也不能改变。
limit:表示Buffer容器中不可被读取的区域的第一个索引,即位于Buffer容器中的索引为0到limit之间的区域都可以进行读取操作。缓冲区的limit值从不为负,也从不大于其容量。
position:用于指定下一个可以被读写的缓冲区位置索引。新创建的Buffer对象,position的默认值都是0,没几年下一次读取或写入操作,position的值都会自动向后移动一步。
2.Channel(通道)
Channel是一个接口对象,它类似于传统的流对象,但与传统的流对象又有些不同,具体表现如下:
Channel可以异步地执行I/O读写操作。
Channel的读写操作时双向的,即可以从Channel中读取数据,又可以写入数据到Channel,而流的读写操作通常是单向的。
Channel可以直接将指定文件的部分或者全部直接映射成Buffer。
Channel只能与Buffer进行交互,程序不能直接读写Channel中的数据。
注:Channel对象并不是通过构造方法来创建的,而是通过传统I/O的getChannel()方法来获取对应的Channel。