• Netty--NIO的基本介绍(NIO组件,ByteBuffer基本使用,FileChannel的用法)


    1. NIO 的三大组件

    NIO从字面上理解:non-blocking io 非阻塞 IO

    组件1:Channel是读写数据的双向通道

    常见的 Channel:FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel

    组件2:Buffer用来缓冲读写数据,常见的 buffer 有ByteBuffer 

    组件3:选择器

    2. NIO操作文件相关的基本操作(FileChannel和ByteBuffer 配合使用)

    FileChannel可以使用文本输入输出流创建,也可以用随机流创建

    Bytebuffer模型:

    创建一个普通的文本:

    D:\\nettytest\\test.txt

    内容:aabbcceeff

    1. public class ByteBufferUtil {
    2. public static void main(String[] args) throws IOException {
    3. // 源文件地址
    4. FileChannel fileChannel = new RandomAccessFile("D:\\nettytest\\test.txt", "r").getChannel();
    5. // 目标文件地址
    6. FileChannel fileChannelTo = new RandomAccessFile("D:\\nettytest\\test1.txt", "rw").getChannel();
    7. // 设置定长的缓存区,分配空间
    8. ByteBuffer buffer = ByteBuffer.allocate(4);
    9. int len = -1;
    10. // 向 buffer 写入数据,读fileChannel到末尾的时候fileChannel.read(buffer))为-1
    11. while ((len = fileChannel.read(buffer)) != -1){
    12. buffer.flip(); // 切换到读模式(limit--最大限度 = position--指针;position = 0;)
    13. fileChannelTo.write(buffer);
    14. for (long i = 0; i < buffer.position(); i++) {
    15. System.out.println((char) buffer.get((int) i));
    16. }
    17. System.out.println("=================");
    18. // 切换到写模式( position = 0;limit = capacity--容量)
    19. buffer.clear();
    20. }
    21. }
    22. }

    控制台打印信息:

    =================
    a
    a
    b
    b
    =================
    c
    c
    e
    e
    =================
    f
    f

    3. transferTo()方法

    需要复制大文件时,这个方法超级好用(底层限制,一次性最大复制2G,大于2G需要循环使用)

    需要自己做文件分片操作的,可以看下这个博客:Java文件分块读写,文件分片读写(大文件分块写入本地并合入)_傻鱼爱编程的博客-CSDN博客_java 文件分片读取

     基本用法:

    1. public class TestFileChannelTransferTo {
    2. public static void main(String[] args) {
    3. try (
    4. FileChannel from = new FileInputStream("D:\\nettytest\\666.zip").getChannel();
    5. FileChannel to = new FileOutputStream("D:\\nettytest\\888.zip").getChannel();
    6. ) {
    7. // 效率高,底层会利用操作系统的零拷贝进行优化, 最大2g数据
    8. long size = from.size();
    9. // left 变量代表还剩余多少字节,如果大于2g会循环多次
    10. for (long left = size; left > 0; ) {
    11. System.out.println("position:" + (size - left) + " left:" + left);
    12. /**
    13. * 从from复制到to
    14. * 参数1:(size - left) 复制起始点
    15. * 参数2:(size - left) 复制末尾点
    16. * 参数3:复制到哪个文件
    17. */
    18. left -= from.transferTo((size - left), left, to);
    19. }
    20. } catch (IOException e) {
    21. e.printStackTrace();
    22. }
    23. }
    24. }

  • 相关阅读:
    class的基本用法
    Maven 是什么?为什么要学习Maven?
    浅谈ArrayList和LinkedList
    DHTMLX Gantt 8.0.5 Crack -甘特图
    【附源码】计算机毕业设计JAVA宠物领养管理系统
    工业智能网关BL110应用之二十四: 如何添加报警与事件
    数据结构学习笔记——图的遍历(深度优先搜索和广度优先搜索)
    2024年 计算机专业毕业设计选题推荐 选题指导
    筛选日志并生成序列化文件
    【每日一题Day343】LC2731移动机器人 | 脑筋急转弯+数学
  • 原文地址:https://blog.csdn.net/m0_57640408/article/details/126316212