JavaSe—I/O流

Java I/O流包括字节流和字符流,按数据流向分为输入流和输出流,按功能分为节点流和处理流。转换流用于字节流与字符流间转换。File类处理文件操作,RandomAccessFile支持随机读写。NIO引入了Buffer、Channel和Selector,提供非阻塞I/O和多通道选择功能。
摘要由CSDN通过智能技术生成

概述: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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值