java基础知识合集-io

发布时间 2023-04-09 11:30:39作者: 下雨天打盹

1.IO简介

2.IO分类

2.1.流分类

按照流的流向分,可以分为输入流和输出流

按照操作单元划分,可以划分为字节流和字符流

按照流的角色划分为节点流和处理流

Java lO流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在紧密的联系,Java lO流的40多个类都是从如下4个抽象类基类中派生出来的

InputStream/Reader:所有的输入流的基类,前者是字节输入流,后者是字符输入流,OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流

 

2.2.字节流和字符流

字节流以字节为单位输入输出数据,字节流按照8位传输

字符流以字符为单位输入输出数据,字符流按照16位传输

不管是文件读写还是网络发送接收,信息的最小存储单元都是字节,那为什么IO流操作要分为字节流操作和字符流操作呢?

字符流是由Java虚拟机将字节转换得到的,问题就出在这个过程还算是非常耗时,并且如果我们不知道编码类型就很容易出现乱码问题。所以IO流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好

2.3.IO模型分类

UNIX系统下,IO模型一共有3种:同步阻塞I/O、同步非阻塞I/O、异步I/O

在java模式下,分为BIO,NIO,AIO

2.3.1.BIO(Blocking l/O)

BIO属于同步阻塞IО模型

2.3.2.NIO(Non-blocking/New I/O)

NIO是一种同步非阻塞的IO模型,对应java.nio包,提供了Channel,Selector,Buffer等抽象,NIO中的N可以理解为Non-blocking,它支持面向缓冲的,基于通道的IO操作方法,对于高负载、高并发的网络应用,应使用NIO的非阻塞模式来开发,NIO分为直接缓冲区和非直接缓冲区

非直接缓冲区通过拷贝

读取:当Java应用程序读取文件时,磁盘文件数据先读取到内核地址空间对应的物理内存缓冲区,再拷贝到用户地址空间对应的物理内存缓冲区,然后才能被应用程序读取

写入:也是一样的

优点是安全,缺点是速度慢,因为需要多一次拷贝

直接缓冲区是通过物理内存映射文件直接传递

在内核地址空间的物理内存划分了一块缓冲区,操作系统直接把数据读到这个缓冲区,然后jvm也可以直接读写这个区域,这部分不属于jvm内存,属于操作系统内存

特点:①可以减少了一次数据拷贝,但是用户态与内核态的切换次数没有减少

②不安全,因为我们只是把数据写入了物理内存,具体什么时候写入磁盘文件不是由java程序控制的

③直接内存不受jvm垃圾回收的影响,java中的DirectByteBuf对象仅维护了此内存的虚引用,内存回收分成两步:DirectByteBuf对象被垃圾回收,将虚引用加入引用队列;通过专门线程访问引用队列,根据虚引用释放堆外内存

 

2.3.3.AIO(Asynchronous I/O)

AIO也就是NIO2,它是异步非阻塞的IO模型

2.4.IO设计模式