开发者社区> yichudu> 正文

java NIO

简介: 传统的io叫BIO,Blocked Input Output。 NIO,Non-Blocked Input Output。1.同BIO的比较 1.1 阻塞与非阻塞 BIO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。1.2 单向与双向 BIO的操作通常是单向的,即一个流必须是InputStrea
+关注继续查看
传统的io叫BIO,Blocked Input Output。
NIO,Non-Blocked Input Output。

1.同BIO的比较

1.1 阻塞与非阻塞

BIO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。

1.2 单向与双向

BIO的操作通常是单向的,即一个流必须是InputStreamOutputStream的子类,只能单向处理。
NIO的channel,可以双向读写。所以它比stream可以更好地映射底层操作系统的API。特别是在linux OS中,网络编程的底层通道都是全双工的。

2.Channel

java.nio.channels.Channel

channel是一个通道,通过它可以读取和写入数据。

FileChannel 从文件中读写数据。

DatagramChannel 能通过UDP读写网络中的数据。
SocketChannel 能通过TCP读写网络中的数据。

ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。

3.selector

java.nio.channels.Selector

多路复用器。

它会不断轮询注册在其上的channel,如果某个channel有新的事件(如建立新连接、读事件、写事件),这个channel就处于就绪状态,会被selector轮询出来。然后通过selectionKey可以获取就绪的Channel的集合,进行后续的IO操作。

只需一个线程负责selector轮询,就可以接入成千上万的客户端,这比以前是个非常大的进步。

Selector java.nio.channels.Selector.open()
打开一个selector。
SelectionKey java.nio.channels.SelectableChannel.register(Selector sel, int ops) 
向Selector注册此channel。
SelectableChannel java.nio.channels.SelectionKey.channel()
返回这个SelectionKey对应的channel。
boolean java.nio.channels.SelectionKey.isReadable()
对应的channel是否可读。

int java.nio.channels.Selector.select() 

同步函数。当注册在其上的若干个channel有IO就绪动作时,得到返回。

4.SocketChannel

跟TCP通信相关的channel。

4.1 server

java.nio.channels.ServerSocketChannel
就是ServerSocketChannel。
ServerSocketChannel java.nio.channels.ServerSocketChannel.open()
拿到ServerSocketChannel,起到作构造函数的效果。
ServerSocket java.nio.channels.ServerSocketChannel.socket()
获取ServerSocket。
void java.net.ServerSocket.bind(SocketAddress endpoint)
绑定端口。
SocketChannel java.nio.channels.ServerSocketChannel.accept() 
监听socket收到链接请求,返回一个通信socket。

4.2 client

SocketChannel java.nio.channels.SocketChannel.open(SocketAddress remote)
客户端链接远程端口。

4.3 通信部分

int java.nio.channels.SocketChannel.write(ByteBuffer src)
将src的内容写入channel里。
int java.nio.channels.SocketChannel.read(ByteBuffer dst)
将channel的数据写入dst中。

5.ByteBuffer

java.nio.ByteBuffer

nio中很常见的一个类,用于缓冲字节。
ByteBuffer java.nio.ByteBuffer.allocate(int capacity)
拿到ByteBuffer。初始时,limit为capacity,position为0。
ByteBuffer java.nio.ByteBuffer.put(byte[] src)
将src内容放入自身。

byte[] java.nio.ByteBuffer.array()

以byte数组的形式返回自身内容。
Buffer java.nio.Buffer.flip()

常用于读写模式的反转。

5.1 图解flip

图5-1 put。写模式下,往buffer里写一个字节,并把postion移动一位。写模式下,一般limit与capacity相等。

图5-2 flip。写完数据,需要开始读的时候,将postion复位到0,并将limit设为当前postion。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java NIO为何导致堆外内存OOM了?
某天报警:某台机器部署的一个服务突然无法访问。谨记第一反应登录机器查看日志,因为服务挂掉,很可能因OOM。这个时候在机器的日志中发现了如下的一些信息
122 0
Java 最常见面试题:BIO、NIO、AIO 有什么区别?
Java 最常见面试题:BIO、NIO、AIO 有什么区别?
53 0
即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]
为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第9 期。
106 0
Java NIO学习(二):Channel通道
Java NIO 的通道类似流,但又有些不同:
54 0
Java NIO学习(一):Java NIO概述
IO 的操作方式通常分为几种:同步阻塞 BIO、同步非阻塞 NIO、异步非阻塞 AIO。
58 0
通俗易懂的JAVA BIO NIO AIO 原理白话文解释,区别,优缺点及代码使用案例
通俗易懂的JAVA BIO NIO AIO 原理白话文解释,区别,优缺点及代码使用案例
84 0
《Java I/O 模型》Java NIO
《Java I/O 模型》Java NIO
43 0
【Netty】Java NIO 基础
Netty本质是一个NIO框架,适用于服务器通讯相关的多种应用场景。 Netty作为一款基于Java开发的高性能网络框架,想要从认识到熟悉再到掌握最终理解,因此我们需要从最基础的NIO开始学习。如果你已经学习并掌握了NIO相关知识,那么可以直接进入Netty相关文章的学习;如果没有了解过也没有关系,那我们就从当前文章开始学习吧!🎉🎉🎉
130 0
Java NIO随笔
分享学习NIO的一些心得,包括核心组件,与IO的主要区别,以及适用场景三部分
99 0
java Nio(一) : Nio 和Io 的区别
java Nio(一) : Nio 和Io 的区别
69 0
+关注
yichudu
文章
问答
视频
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
JAVA开发手册1.5.0
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多