io和nio的原理 (io与nio的区别怎么实现)

什么是NIO

java.nio全称java non-blocking IO(实际上是 new io),是指JDK 1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。

NIO的组成部分

io与nio的区别怎么实现,io与nio区别简单介绍

Buffer 缓冲区;高效的数据容器

不同的是BIO将数据直接读写到Stream对象中

NIO的数据操作都是在缓冲区中进行的

缓冲区实际上是一个数组,常见类型ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloutBuffer,DoubleBuffer

Channel 在NIO中被用来支持批量式IO操作的一种抽象,与流不同,通道是双向的。

File/Socket,通常被认为是比较高层次的抽象,而Channel则是更加偏向操作系统底层的一种抽象,这也使得NIO得以充分利用现代操作系统底层机制,进行性能优化。分两大类:网络读写SelectableChannel(子类包括SocketChannel和ServerSocketChannel);文件操作(FileChannel)

Selector 是NIO实现多路复用的基础

它提供一种高效机制,不断轮询注册在其上的Channel,找出处于就绪状态,通过SelectionKey取得就绪的Channel集合,进行后续的IO操作。服务端只要提供一个负责Selector轮询的线程即可,实现单线程对多Channel的高效管理,也是基于操作系统底层机制

Charset 提供Unicode字符串定义,NIO也提供了相应的编解码等

NIO应用场景

服务器需要支持超大量的长时间连接。比如10000个连接以上,并且每个客户端并不会频繁地发送太多数据。例如总公司的一个中心服务器需要收集全国便利店各个收银机的交易信息,只需要少量线程按需处理维护的大量长期连接。

Jetty、Mina、Netty、ZooKeeper等都是基于NIO方式实现。

NIO框架

流行基于Java NIO通信框架有Mina、Netty、Grizzly

国产得用有用过tio