当前位置: 首页 > news >正文

Java中的NIO编程实践精华

Java中的NIO编程实践精华

大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!

在Java网络编程中,NIO(New I/O)是一种基于通道和缓冲区的非阻塞I/O模型,相比于传统的阻塞I/O模型,NIO具有更高的并发性和可扩展性。NIO提供了Channel、Buffer、Selector等核心组件,通过这些组件可以实现高效的网络通信。本文将深入探讨Java中的NIO编程实践精华,帮助开发者更好地理解和应用NIO技术。

1. Channel与Buffer

在NIO中,Channel是数据的载体,类似于传统IO中的Stream,而Buffer是数据的容器,用于存储读取或写入的数据。Channel与Buffer之间是通过读写操作进行交互的,Channel负责读写数据,而Buffer负责存储数据。常见的Channel包括FileChannel、SocketChannel、ServerSocketChannel等,而Buffer包括ByteBuffer、CharBuffer、IntBuffer等。

// 创建文件Channel
FileChannel channel = new RandomAccessFile("example.txt", "rw").getChannel();
// 创建Buffer
ByteBuffer buffer = ByteBuffer.allocate(1024);

2. Selector

Selector是NIO的核心组件之一,用于监控多个Channel的事件状态,并在事件就绪时进行相应的处理。通过Selector可以实现单线程管理多个Channel,提高系统的并发性和性能。Selector主要包括四种事件类型:连接就绪、读就绪、写就绪和接收就绪。开发者可以根据具体需求注册不同类型的事件,并在事件就绪时进行相应的处理。

Selector selector = Selector.open();
// 将Channel注册到Selector上,并指定感兴趣的事件类型
channel.register(selector, SelectionKey.OP_READ);

3. 非阻塞I/O

NIO的核心特性之一是非阻塞I/O,即在等待数据到达时不会阻塞线程,而是立即返回,让线程可以执行其他任务。通过非阻塞I/O,可以提高系统的并发性和吞吐量,降低系统的资源消耗。开发者可以通过设置Channel为非阻塞模式,实现非阻塞I/O操作。

channel.configureBlocking(false);

4. 多路复用

NIO的多路复用是通过Selector实现的,通过Selector可以同时管理多个Channel,并在事件就绪时进行相应的处理。多路复用可以大大减少线程的数量,提高系统的并发性和性能。开发者可以根据具体需求注册不同类型的事件,并通过Selector监控这些事件的状态。

while (true) {int readyChannels = selector.select();if (readyChannels == 0) continue;Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> keyIterator = selectedKeys.iterator();while (keyIterator.hasNext()) {SelectionKey key = keyIterator.next();// 处理事件}
}

5. 非阻塞Socket通信实例

下面是一个简单的使用NIO实现的非阻塞Socket通信的示例,通过ServerSocketChannel监听客户端连接请求,并使用SocketChannel进行数据读写。

ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.socket().bind(new InetSocketAddress(8080));
serverChannel.configureBlocking(false);
Selector selector = Selector.open();
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {int readyChannels = selector.select();if (readyChannels == 0) continue;Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> keyIterator = selectedKeys.iterator();while (keyIterator.hasNext()) {SelectionKey key = keyIterator.next();if (key.isAcceptable()) {// 接受连接请求ServerSocketChannel server = (ServerSocketChannel) key.channel();SocketChannel client = server.accept();client.configureBlocking(false);client.register(selector, SelectionKey.OP_READ);} else if (key.isReadable()) {// 读取数据SocketChannel client = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = client.read(buffer);// 处理读取的数据}keyIterator.remove();}
}

综上所述,Java中的NIO编程是一种高效的网络编程模型,具有非阻塞I/O、多路复用等特性,适用于构建高性能、高并发的网络应用。通过合理地应用Channel、Buffer、Selector等核心组件,开发者可以实现高效的网络通信,并提高系统的可扩展性和性能。

相关文章:

  • 程序的“通用性”和“过度设计”困境
  • zookeeper学习、配置文件参数详解
  • SSM旅游系统
  • WDF驱动开发-WDF总线枚举(一)
  • obsidian中用check list 打造待办清单
  • 在阿里云使用Docker部署MySQL服务,并且通过IDEA进行连接
  • 软件介绍—Fluent Reader (RSS阅读器)
  • SparkSQL的分布式执行引擎-Thrift服务:学习总结(第七天)
  • Java学习 - 网络TCP,UDP协议讲解
  • 基于uni-app和图鸟UI开发上门服务小程序
  • linux库函数 gettimeofday() localtime 使用demo
  • 达梦8 通过日志解释数据守护系统的关停顺序
  • 【Java算法】滑动窗口 下
  • 基于JSP的“塞纳河畔左岸”的咖啡馆管理系统
  • Linux通配符总结
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android 架构优化~MVP 架构改造
  • ES10 特性的完整指南
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java 最常见的 200+ 面试题:面试必备
  • Making An Indicator With Pure CSS
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 从0实现一个tiny react(三)生命周期
  • 服务器之间,相同帐号,实现免密钥登录
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 欢迎参加第二届中国游戏开发者大会
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端js -- this指向总结。
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • scrapy中间件源码分析及常用中间件大全
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​马来语翻译中文去哪比较好?
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (1)bark-ml
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (力扣)循环队列的实现与详解(C语言)
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)c52学习之旅-流水LED灯
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net连接MySQL的方法
  • @Bean, @Component, @Configuration简析