NIO知识点
2021-04-19 09:53:10 0 举报
AI智能生成
NIO知识点
作者其他创作
大纲/内容
简介
JDK 1.4中的java.nio.*包中引入新的Java I/O库,其目的是提高速度
IO操作往往在两个场景下会用到
文件IO
网络IO
而我们的NIO的魅力就在于网络IO!
IO是面向流的处理,NIO是面向块(缓冲区)的处理
面向流的I/O 系统一次一个字节地处理数据。
一个面向块(缓冲区)的I/O系统以块的形式处理数据。
NIO主要有三个核心部分组成:
buffer缓冲区
Channel管道
Selector选择器
缓冲区Buffer
ByteBuffer是用得最多的实现类
put()
get()
Buffer类维护了4个核心变量属性来提供关于其所包含的数组的信息
容量Capacity
上界Limit
位置Position
标记Mark
scatter和gather、字符集
分散读取(scatter):将一个通道中的数据分散读取到多个缓冲区中
聚集写入(gather):将多个缓冲区中的数据集中写入到一个通道中
字符集(只要编码格式和解码格式一致,就没问题了)
I/O模型
文件描述符
Linux 的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令(api),返回一个file descriptor(fd,文件描述符)
在Linux下对文件的操作是利用文件描述符(file descriptor)来实现的
内核空间和用户空间
为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分
内核空间
用户空间
IO模型
阻塞I/O
在进程(用户)空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间一直等待
非阻塞I/O
recvfrom从应用层到内核的时候,如果没有数据就直接返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询检查这个状态,看内核是不是有数据到来。
I/O多路复用
调用select/poll/epoll/pselect其中一个函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。
通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符其中的任意一个进入读就绪状态,select()函数就可以返回
select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接
信号驱动I/O
异步IO
buffer缓冲区和Channel管道简介
在NIO中并不是以流的方式来处理数据的,而是以buffer缓冲区和Channel管道配合使用来处理数据
简答来说就是:通过Channel管道运输着存储数据的Buffer缓冲区的来实现数据的处理
相对于传统IO而言,流是单向的。对于NIO而言,有了Channel管道这个概念,我们的读写都是双向的
FileChannel通道核心要点
使用FileChannel配合缓冲区实现文件复制的功能
使用内存映射文件的方式实现文件复制的功能(直接操作缓冲区)
通道之间通过transfer()实现数据的传输(直接操作缓冲区)
直接与非直接缓冲区
非直接缓冲区是需要经过一个:copy的阶段的(从内核空间copy到用户空间)
直接缓冲区不需要经过copy阶段,也可以理解成--->内存映射文件
使用直接缓冲区有两种方式:
缓冲区创建的时候分配的是直接缓冲区
在FileChannel上调用map()方法,将文件直接映射到内存中创建
NIO学习
NIO的学习主要是针对网络的IO进行学习,对于FileChannle还是阻塞的
在NIO中主要是理解Selector选择器:它能够对多个事件监听(一个线程处理多个事件)
所以说:NIO是使用IO的多路复用模型的
使用NIO的步骤:
将Socket通道注册到Selector中,监听感兴趣的事件
当感兴趣的时间就绪时,则会进去我们处理的方法进行处理
每处理完一次就绪事件,删除该选择键(因为我们已经处理完了)
管道和DataGramChannel
0 条评论
下一页