做业务网站,旅游网站营销,知识管理软件排名,网站推广费用大概需要多少钱Java NIO基本介绍 java non-blocking I/O 称为NIO(也叫New IO)。JDK4开始提供,同步非阻塞相关内容在 java.nio 包及子包下#xff0c;对java.io 包中的很多类进行改写。三大核心: Channel(通道)#xff0c;Buffer(缓冲区),Selector(选择器)NIO是面向缓冲区或者面向块编程的。… Java NIO基本介绍 java non-blocking I/O 称为NIO(也叫New IO)。JDK4开始提供,同步非阻塞相关内容在 java.nio 包及子包下对java.io 包中的很多类进行改写。三大核心: Channel(通道)Buffer(缓冲区),Selector(选择器)NIO是面向缓冲区或者面向块编程的。数据读取到一个它后处理的缓冲区需要时可在缓冲区中前后移动这就增加了处理过程中的灵活性使用它可以提供非阻塞式的高伸缩性网络NIO的非阻塞模式使一个线程从某通道发送请求或者读取数据但是它仅能得到目前可用的数据如果目前没有数据可用时就什么都不会获取而不是保持线程阻塞所以直至数据可以读取之前该线程可以继续做其他的事情。通俗理解: NIO 是可以做到用一个线程来处理多个操作。假设有 10000 个请求过来,根据实际情况可以分配50 或者 100 个线程来处理。不像之前的阻塞IO 那样非得分配 10000 个。HTTP2.0 使用了多路复用的技术做到同一个连接并发处理多个请求而且并发请求的数量比 HTTP1.1 大了好几个数量级基本案例 NIO 和 BIO 的比较 BIO以流的方式处理数据,而NIO以块的方式处理数据,I/O块的效率比I/O流高很多BIO 是阻塞的NIO则是非阻塞的BIO 基于字节流和字符流进行操作而NIO基于Channel通道和Buffer缓冲区进行操作数据总是从通道读取到缓冲区中或者从缓冲区写入到通道中。Selector 选择器用于监听多个通道的事件(比如:连接请求,数据到达等)因此使用单个线程就可以监听多个客户端通道 Selector、Channel 和 Buffer 的关系图 每个channel都会对应一个Buffer一个Selector对应一个线程多个channel会注册到其selectorSelector会根据不同的Event在各个Channel上切换channel 是双向的可以返回底层操作系统的情况比如Linux底层的操作系统通道就是双向的.Buffer是一个内存块底层是一个数组数据的读取写入是通过 Buffer这个和BIO有所区别BIO 中要么是输入流或者是输出流不能双向但是NIO的Buffer是可以读也可以写需要flip()切换 缓冲区Buffer Buffer本质上是一个可以读写数据的内存块可以理解成是一个容器对象(含数组)该对象提供了一组方法可以更轻松地使用内存块Buffer对象内置了一些机制能够跟踪和记录缓冲区的状态变化情况。Channel 读写的数据都必须经由BufferBuffer是父类、抽象类类的层级关系图 常用Buffer子类 ByteBuffer 存储字节数据到缓冲区shortBuffer 存储字符串数据到缓冲区CharBuffer 存储字符数据到缓冲区IntBuffer 存储整数数据到缓冲区LongBuffer 存储长整型教据到缓冲区DoubleBuffer 存储小数到缓冲区FloatBuffer 存储小数到缓冲区 这些Buffer都把数据存于自己类型的数组 Buffer类的四个属性: Capacity容量即可以容纳的最大数据量在缓冲区创建时被设定并且不能改变Limit表示缓冲区的当前终点不能对缓冲区超过极限的位置进行读写操作。且极限是可以修改的Position位置下一个要被读写的元素的索引每次读写缓冲区数据时都会改变改值为下次读写做准备Mark标记 Buffer类相关方法 public abstract class Buffer{
//JDK1.4时引入的api
public final int capacity//返回此缓冲区的容量
public final int position//返回此缓冲区的位置
public final Buffer positionint newPositio//设置此缓冲区的位置
public final int limit//返回此缓冲区的限制
public final Buffer limitint newLimit//设置此缓冲区的限制
public final Buffer mark//在此缓冲区的位置设置标记
public final Buffer reset//将此缓冲区的位置重置为以前标记的位置
public final Buffer clear//清除此缓冲区即将各个标记恢复到初始状态但是数据并没有真正擦除
public final Buffer flip//反转此缓冲区
public final Buffer rewind//重绕此缓冲区
public final int remaining//返回当前位置与限制之间的元素数
public final boolean hasRemaining//告知在当前位置和限制之间是否有元素
public abstract boolean isReadOnly//告知此缓冲区是否为只读缓冲区
//JDK1.6时引入的api
public abstract boolean hasArray//告知此缓冲区是否具有可访问的底层实现数组
public abstract Object array//返回此缓冲区的底层实现数组
public abstract int arrayOffset/返回此缓冲区的底层实现数组中第一个缓冲区元素的偏移量
public abstract boolean is Direct//告知此缓冲区是否为直接缓冲区
} ByteBuffer 除了boolean其他基本类型都有一个Buffer类型与之相对应最常用的自然是 ByteBuffer 类(二进制数据)该类的主要方法如下:
public abstract class ByteBuffer(
//缓冲区创建相关api
public static ByteBuffer allocateDirectint capacity//创建直接缓冲区
public static ByteBuffer allocateint capacity//设置缓冲区的初始容量
public static ByteBuffer wrapbyte[] array//把一个数组放到缓冲区中使用
//构造初始化位置offset和上界length的缓冲区
public static ByteBuffer wrap(byte[] array,int offset, int length)
//缓存区存取相关API
public abstract byte get//从当前位置position上getget之后position会自动1
public abstract byte getint index//从绝对位置get
public abstract ByteBuffer putbyte b//从当前位置上添加put之后position会自动1
public abstract ByteBuffer putint indexbyte b//从绝对位置上put 关于Buffer的注意事项和细节 ByteBuffer支持类型化的put和get,数据类型必须保持一致否则可能有 BufferUnderflowException 异常。Buffer支持转换为只读buffer,调用asReadOnlyBuffer()NIO还提供了MappedByteBuffer可以让文件直接在内存(堆外内存) 中进行修改而如何同步到文件由NIO来完成.NIO还支持通过多个Bufferbuffer数组完成读写操作即 Scattering分散和 Gathering合并