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) {
        }
    }
}
posted @ 2021-10-10 16:03  一个经常掉线的人  阅读(61)  评论(0编辑  收藏  举报