netty前置知识之NIO3大组件
基本概念
NIO为 non-blocking IO 非阻塞IO
Channel Buffer
Selector
在了解selector前 我们先了解早期服务器设计
多线程版
线程池版
Selector设计
简单的使用下Channel和Buffer
导入依赖
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.39.Final</version>
</dependency>
创建一个data.txt
使用Channel和Buffer来读取文件
public class TestByteBuffer {
public static void main(String[] args) {
//通过输入流获得Channel
try (FileChannel channel = new FileInputStream("data.txt").getChannel()) {
//获取一个缓冲区
ByteBuffer buffer = ByteBuffer.allocate(10);
//从channel读取数据 写入缓冲区
channel.read(buffer);
buffer.flip();//切换至读模式
while (buffer.hasRemaining()){
byte b = buffer.get();
System.out.println((char) b);
}
} catch (IOException e) {
}
}
}
优化代码:
上面我们缓冲区大小就开了10 如果文件内容超过10个字节就无法完全读取 我们需要写一个循环多次读取
文件数据
使用循环读取:
public class TestByteBuffer {
public static void main(String[] args) {
//通过输入流获得Channel
try (FileChannel channel = new FileInputStream("data.txt").getChannel()) {
//获取一个缓冲区
ByteBuffer buffer = ByteBuffer.allocate(10);
while (true){
//从channel读取数据 写入缓冲区
int len = channel.read(buffer);
if(len == -1){//说明读取完毕
break;
}
buffer.flip();//切换至读模式
while (buffer.hasRemaining()){
byte b = buffer.get();
System.out.println((char) b);
}
buffer.clear();//切换至写模式
}
} catch (IOException e) {
}
}
}