Netty学习笔记 3.1 Java NIO 编程
Java NIO 基本介绍
Java NIO 全称 java non-blocking IO,是指 JDK 提供的新 API。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,被统称为 NIO(即 New IO),是同步非阻塞的
NIO 相关类都被放在 java.nio 包及子包下,并且对原 java.io 包中的很多类进行改写。【基本案例】
NIO 有三大核心部分:Channel(通道),Buffer(缓冲区), Selector(选择器)
NIO是 面向缓冲区 ,或者面向 块 编程的。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞式的高伸缩性网络
Java NIO的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。【后面有案例说明】
通俗理解:NIO是可以做到用一个线程来处理多个操作的。假设有10000个请求过来,根据实际情况,可以分配50或者100个线程来处理。不像之前的阻塞IO那样,非得分配10000个。
HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。
案例说明:
package com.my.nio;
import java.nio.IntBuffer;
public class BasicBuffer {
public static void main(String[] args) {
//举例说明Buffer 的使用 (简单说明)
//创建一个Buffer, 大小为 5, 即可以存放5个int
IntBuffer intBuffer = IntBuffer.allocate(5);
//向buffer 存放数据
// intBuffer.put(10);
// intBuffer.put(11);
// intBuffer.put(12);
// intBuffer.put(13);
// intBuffer.put(14);
for(int i = 0; i < intBuffer.capacity(); i++) {
intBuffer.put( i * 2);
}
//如何从buffer读取数据
//将buffer转换,读写切换(!!!)
/*
public final Buffer flip() {
limit = position; //读数据不能超过5
position = 0;
mark = -1;
return this;
}
*/
intBuffer.flip();
intBuffer.position(1);//1,2
System.out.println(intBuffer.get());
intBuffer.limit(3);
while (intBuffer.hasRemaining()) {
System.out.println(intBuffer.get());
}
}
}
package com.atguigu.nio;
import java.nio.IntBuffer;
public class BasicBuffer {
public static void main(String[] args) {
//举例说明Buffer 的使用 (简单说明)
//创建一个Buffer, 大小为 5, 即可以存放5个int
IntBuffer intBuffer = IntBuffer.allocate(5);
//向buffer 存放数据
// intBuffer.put(10);
// intBuffer.put(11);
// intBuffer.put(12);
// intBuffer.put(13);
// intBuffer.put(14);
//通过调用length()方法可以得到当前StringBuffer的长度。而通过调用capacity()方法可以得到总的分配
//
//容量。
for(int i = 0; i < intBuffer.capacity(); i++) {
intBuffer.put( i * 2);
}
//如何从buffer读取数据
//将buffer转换,读写切换(!!!)
/*
public final Buffer flip() {
limit = position; //读数据不能超过5
position = 0;
mark = -1;
return this;
}
*/
//flip的作用有两个:
//1. 把limit设置为当前的position值
//2. 把position设置为0
//然后处理的数据就是从position到limit直接的数据,也就是你刚刚读取过来的数据
intBuffer.flip();
intBuffer.position(1);//1,2
System.out.println(intBuffer.get());
intBuffer.limit(3);
while (intBuffer.hasRemaining()) {
System.out.println(intBuffer.get());
}
}
}