Java NIO
来源:互联网 发布:网站压力测试软件 编辑:程序博客网 时间:2024/06/06 12:24
概述
NIO有三大核心组件:Channel、Buffer、Selector。传统IO基于字节流和字符流进行操作,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作的。传统IO(BIO)是同步阻塞的,而NIO是同步非阻塞。AIO是异步非阻塞的。
同步和异步
同步和异步是针对应用程序和内核的交互而言的,
同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,
而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。异步是需要操作系统的支持。
阻塞和非阻塞
阻塞是在发起调用之后必须一致等待结果返回,期间不能做其他事情。
非阻塞是在发起调用之后会立即得到一个返回值(也许并没有执行完成)。
NIO的实现方式
Channel
这些是主要的Channel的实现类
* FileChannel :从文件读写
* DatagramChannel:从UDP读写
* SocketChannel:从TCP读写
* ServerSocketChannel:建立一个监听器,可以接受新的TCP连接
Buffer
本质上是一块可以写入数据,也可以读取数据的的内存,被包装为NIO的Buffer类。
一般对于Buffer的读写会分以下4步:
1. 写入数据到Buffer(int bytesRead = inChannel.read(buf);)
2. 调用flip()方法:将buffer切换为读模式
3. 从Buffer中读取数据
4. 调用clear()方法【清空buffer】或者compact()方法【将已经读取的清空,为读取的放在buffer的头部】
Selector
Select可以检测多个Channel是否为读写时间做好准备的组件。这样一个线程可以管理多个Channel,从而管理多个网络连接。
与Selector一起使用时,Channel必须处于非阻塞模式下。这意味着不能将FileChannel与Selector一起使用,因为FileChannel不能切换到非阻塞模式。而套接字通道都可以。
Scatter/Gather
Scatter:将一个Channel的数据放到多个Buffer中
Gather:将多个Buffer的数据写入一个Channel中
参考链接
http://ifeve.com/java-nio-vs-io/
- Java NIO: NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- NIO--JAVA NIO 入门
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- Java NIO:NIO概述
- 7---LeetCode【tag: Array】【Stock I】|C语言|总结
- 隐藏系统返回按钮,保留系统滑动返回
- 前端初学学习进程V
- KINECT2.0开发实践_1:简单介绍
- 指定TreeNode排序
- Java NIO
- 拆红包特效
- 调用一个脚本
- javascript 循环遍历
- 一个基于ES6+webpack的vue小demo
- 抽象类和接口的功能与区别
- 关于一些基础的Java问题的解答(九)
- jQuery 代码编写优化
- 桌面图标变成不可识别的处理办法