首页 > 编程语言 >Java NIO 中的 Buffer、Channel 和 Selector:高效的非阻塞 IO

Java NIO 中的 Buffer、Channel 和 Selector:高效的非阻塞 IO

时间:2023-10-14 15:00:58浏览次数:38  
标签:Java NIO Buffer Selector buffer IO Channel

在 Java 中,标准的 IO 操作使用阻塞模式,这意味着每个 IO 操作都会阻塞当前线程直到操作完成。而 Java NIO (New IO) 提供了一种基于事件驱动的非阻塞 IO 模型,通过三大组件——Buffer(缓冲区)、Channel(通道)和Selector(选择器),可以实现更高效的 IO 操作。本文将详细介绍和说明这三大组件的使用。

1. Buffer(缓冲区)

Buffer 是 NIO 中一个关键的组件,它是一个对象数组,用于在内存中存储数据。Buffer 主要有四个核心属性:容量(capacity)、限制(limit)、位置(position)和标记(mark)。通过这些属性,我们可以有效地管理缓冲区中的数据。

Buffer 主要有以下几种类型:

  • ByteBuffer
  • CharBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer

Buffer 的使用流程一般如下:

  1. 创建指定类型的 Buffer:ByteBuffer buffer = ByteBuffer.allocate(1024);
  2. 向缓冲区中写入数据:buffer.put(data);
  3. 切换读写模式:buffer.flip();
  4. 从缓冲区中读取数据:buffer.get(data);
  5. 清空缓冲区或部分清空:buffer.clear();

2. Channel(通道)

Channel 是 NIO 中用于进行 IO 操作的对象,它类似于传统的流。Channel 可以通过多种方式获取,比如 FileChannel、SocketChannel、ServerSocketChannel 等。使用 Channel 进行 IO 操作时,数据会从 Buffer 写入到 Channel 或从 Channel 读取到 Buffer。

Channel 的使用流程一般如下:

  1. 打开一个 Channel:FileChannel channel = new FileInputStream("data.txt").getChannel();
  2. 创建一个 Buffer:ByteBuffer buffer = ByteBuffer.allocate(1024);
  3. 从 Channel 读取数据到 Buffer:int bytesRead = channel.read(buffer);
  4. 切换读写模式:buffer.flip();
  5. 从 Buffer 中读取数据:byte[] data = new byte[bytesRead]; buffer.get(data);
  6. 关闭 Channel:channel.close();

3. Selector(选择器)

Selector 是 NIO 中的一个多路复用器,可以同时监控多个 Channel 上的事件。当有事件发生时,Selector 会通知程序去处理这些事件。使用 Selector 可以实现多个 Channel 的非阻塞 IO 操作。

Selector 的使用流程一般如下:

  1. 打开一个 Selector:Selector selector = Selector.open();
  2. 将 Channel 注册到 Selector 上,并指定感兴趣的事件类型:channel.register(selector, SelectionKey.OP_READ);
  3. 不断调用 Selector 的 select() 方法等待事件发生:selector.select();
  4. 获取发生事件的 SelectionKey 集合:Set<SelectionKey> selectedKeys = selector.selectedKeys();
  5. 遍历处理事件:for (SelectionKey key : selectedKeys) { ... }
  6. 处理完所有事件后,清除 SelectionKey 集合:selectedKeys.clear();

通过使用 Java NIO 提供的 Buffer、Channel 和 Selector,我们可以实现高效的非阻塞 IO 操作。Buffer 提供了灵活的数据操作方式,Channel 允许多种类型的 IO 操作,而 Selector 则提供了对多个 Channel 的事件监控能力。这些组件的结合使用,可以在网络编程、服务器开发等场景中带来更好的性能和可扩展性。

以上就是文章全部内容,感谢阅读!

标签:Java,NIO,Buffer,Selector,buffer,IO,Channel
From: https://blog.51cto.com/u_16268194/7861784

相关文章

  • [JavaScript]arguments对象
    当我们不确定有多少个参数传递的时候,可以使用arguments来获取。在JavaScript中,arguments实际上是充当函数的内置对象。所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。arguments展示形式是一个伪数组,可以进行遍历。伪数组具有以下特点:1.......
  • javaSE基础06(final,常用类,基本数据类型的封装)
    Final关键字(用法:类不想被人继承 ):修饰类:最终的类,不可以被继承 比如String;修饰方法:方法不可以被重写;修饰属性:不可以被重新赋值,但是可以改变变量里的内容;publicclassStudent{Stringname;publicstaticvoidmain(String[]args){finalS......
  • Java程序的main主线程的运行过程
    在Java虚拟机进程中,执行程序代码的任务是由线程来完成的。每当用java命令启动一个Java虚拟机进程,Java虚拟机就会创建并启动一个main主线程,该线程从程序入口main()方法开始执行。main主线程执行main()方法下面以例程1的Sample为例,介绍线程的运行过程。例程1 Sample.javapublicclas......
  • Java零基础入门-基本类型转换、包装类、自动装箱、自动拆箱
    前言在Java编程中,经常需要进行基本类型之间的转换以及包装类与基本类型之间的转换。本文将介绍Java中基本类型转换、包装类、自动装箱与自动拆箱的概念和用法。摘要本文将介绍Java中的基本类型转换、包装类、自动装箱与自动拆箱的概念和应用。首先,我们将讨论基本类型转换的概念......
  • java实现朴素rpc
    五层协议中,RPC在第几层?五层协议应用层传输层网络层链路层物理层我不知道,我要去大气层!远程过程调用(RPC),比较朴素的说法就是,从某台机器调用另一台机器的一段代码,并获取返回结果。这之前的一个基层问题就是进程间通信方式(IPC),从是否设计网络通信分为:......
  • 【华为OD统一考试B卷 | 100分】 报数问题 (1到3报数)(C++ Java Python javaScript)
    华为OD在线刷题平台平台涵盖了华为OD机试A卷+B卷的真题。平台的题库不断更新,确保能够涵盖华为OD机试的所有真题。点击链接注册并开始你的刷题之旅:点击立即刷题华为OD统一考试A卷+B卷新题库说明2023年5月份,华为官方已经将的2022/0223Q(1/2/3/4)统一修改为OD统一考试(A卷)和OD统......
  • On Java 8
    OnJava8OO在“问题空间”(问题实际存在的地方)的元素与“方案空间”(对实际问题进行建模的地方,如计算机)的元素之间建立理想的“一对一”的映射关系。Java不需要sizeof()方法获取数据项被分配的字节大小,因为所有类型的大小在不同平台上是相同的。——Java本身就是一种“与......
  • 建造者模式--Java实现
    画类图具体代码实现//Computer.javapackageorg.example.design003;publicclassComputer{publicComputer(StringCPU,StringRAM,Stringhard,Stringhost){this.CPU=CPU;this.RAM=RAM;Hard=hard;Host=host;......
  • 抽象工厂模式--Java实现
    画类图用人的肤色和性别进行抽象工厂方法模式的实现,肤色和性别组成产品等级结构和产品族;具体代码实现项目结构://AbstractFactory.javapackageorg.example.design002;publicinterfaceAbstractFactory{publicMancreateMan();publicWomancreateWoman();}......
  • 深入了解基数排序:原理、性能分析与 Java 实现
    基数排序(RadixSort)是一种非比较性排序算法,它根据元素的每个位上的值来进行排序。基数排序适用于整数或字符串等数据类型的排序。本文将详细介绍基数排序的原理、性能分析及java实现。基数排序原理基数排序的基本原理是按照低位先排序,然后收集;再按照高位排序,再收集;以此类推,直到最高......