您当前的位置: 首页 > 

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Netty—— AIO示例代码

小志的博客 发布时间:2022-09-25 22:11:24 ,浏览量:0

目录
    • 一、AIO 概述
      • 1.1、AIO 用来解决数据复制阶段的阻塞问题
      • 1.2、异步模型需要底层操作系统(Kernel)提供支持
    • 二、文件 AIO示例代码

一、AIO 概述 1.1、AIO 用来解决数据复制阶段的阻塞问题
  • 同步意味着,在进行读写操作时,线程需要等待结果,还是相当于闲置。
  • 异步意味着,在进行读写操作时,线程不必等待结果,而是将来由操作系统来通过回调方式由另外的线程来获得结果。
1.2、异步模型需要底层操作系统(Kernel)提供支持
  • Windows 系统通过 IOCP 实现了真正的异步 IO
  • Linux 系统异步 IO 在 2.6 版本引入,但其底层实现还是用多路复用模拟了异步 IO,性能没有优势
二、文件 AIO示例代码
  • 示例代码

    package com.example.nettytest.nio.day3;
    
    import lombok.extern.slf4j.Slf4j;
    import java.io.IOException;
    import java.nio.ByteBuffer;
    import java.nio.channels.AsynchronousFileChannel;
    import java.nio.channels.CompletionHandler;
    import java.nio.file.Paths;
    import java.nio.file.StandardOpenOption;
    import static com.example.nettytest.nio.day1.ByteBufferUtil.debugAll;
    
    @Slf4j
    public class AioFileChannel {
        public static void main(String[] args) throws IOException {
            try (AsynchronousFileChannel channel = AsynchronousFileChannel.open(Paths.get("data.txt"), StandardOpenOption.READ)) {
                ByteBuffer buffer = ByteBuffer.allocate(16);
                log.debug("线程"+Thread.currentThread().getName()+":"+"read begin...");
                /**
                 *  channel.read 异步操作
                 *参数1 ByteBuffer
                 *参数2 读取的起始位置
                 *参数3 附件
                 *参数4 回调对象 CompletionHandler
                 * */
                channel.read(buffer, 0, buffer, new CompletionHandler() {
                    @Override //文件读取成功
                    public void completed(Integer result, ByteBuffer attachment) {
                        log.debug("线程"+Thread.currentThread().getName()+":read completed...{}", result);
                        attachment.flip();
                        debugAll(attachment);
                    }
                    @Override //文件读取失败
                    public void failed(Throwable exc, ByteBuffer attachment) {
                        exc.printStackTrace();
                    }
                });
                log.debug("线程"+Thread.currentThread().getName()+":read end...");
            } catch (IOException e) {
                e.printStackTrace();
            }
            //主线程先接收控制台输出,如果没有输出即停止在此处
            System.in.read();
        }
    }
    
  • 输出结果工具类

    package com.example.nettytest.nio.day1;
    
    import io.netty.util.internal.StringUtil;
    
    import java.nio.ByteBuffer;
    
    import static io.netty.util.internal.MathUtil.isOutOfBounds;
    import static io.netty.util.internal.StringUtil.NEWLINE;
    
    public class ByteBufferUtil {
        private static final char[] BYTE2CHAR = new char[256];
        private static final char[] HEXDUMP_TABLE = new char[256 * 4];
        private static final String[] HEXPADDING = new String[16];
        private static final String[] HEXDUMP_ROWPREFIXES = new String[65536 >>> 4];
        private static final String[] BYTE2HEX = new String[256];
        private static final String[] BYTEPADDING = new String[16];
    
        static {
            final char[] DIGITS = "0123456789abcdef".toCharArray();
            for (int i = 0; i  4 & 0x0F];
                HEXDUMP_TABLE[(i             
关注
打赏
1661269038
查看更多评论
0.0476s