java的Nio演进

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

java的Nio演进


前言

在JDK1.4推出JavaNIO之前,基于Java的所有Socket通信都采用了同步阻塞模式

(BIO),这种一请求一应答的通信模型简化了上层的应用开发,但是在性能和可靠性方面

却存在着巨大的瓶颈。因此,在很长一段时间里,大型的应应用服务器都采用C或者C++

语言开发,因为它们可以直接使用操作系统提供的异步I/O或者AIO能力。当并发访问量

增大、响应时间延迟增大之后,采用JavaBIO开发的服务端软件只有通过硬件的不断扩容

来满足高并发和低时延,它极大地增加了企业的成本,并且随着集群规模的不断膨胀,系

统的可维护性也面临巨大的挑战,只能通过采购性能更高的的硬件服务器来解决问题,这会

导致恶性循环。

正是由于Java传统BIO的拙劣表现,才使得Java支持非且塞I/O的呼声日渐高涨,

最终,JDK1.4版本提供了新的NIO类库,Java终于也可以支持非阻塞I/O了。

简介

从JDK1.0到JDK1.3,Java的I/O类库都非常原始,很多UNIX网络编程中的概念或

者接口在1/0类库中都没有体现,例如Pipe、Channel、Buffer和Selector等。2002年发布

JDK1.4时,NIO以JSR-51的身份正式随JDK发布。它新增了个java.nio包,提供了很多

进行异步1/0开发的API和类库

正文

主要的类和接口如下。

  • 进行异步I/O操作的缓冲区ByteBuffer等;
  • 进行异步I/O操作的管道Pipe;
  • 进行各种I/0操作(异步或者同步)的Channel,包括SServerSocketChannel和
    SocketChannel:
  • 多种字符集的编码能力和解码能力;
  • 实现非阻塞I/O操作的多路复用器selector:
  • 基于流行的Perl实现的正则表达式类库;
  • 文件通道FileChannel。
    新的NIO类库的提供,极大地促进了基于Java的异步非阻塞编程的发展和应用,但
    是,它依然有不完善的地方,特别是对文件系统的处理能力仍显不足,主要问题如下。
  • 没有统一的文件属性(例如读写权限);
  • API能力比较弱,例如目录的级联创建和递归遍历,往往需要自己实现:
  • 底层存储系统的一些高级API无法使用;
  • 所有的文件操作都是同步阻塞调用,不支持异步文件读写操作。
    2011年7月28日,JDK1.7正式发布。它的一个比较大的的亮点就是将原来的NIO类
    库进行了升级,被称为NIO2.0。NIO2.0由JSR-203演进而来,它主要提供了如下三个方
    面的改进。
  • 提供能够批量获取文件属性的API,这些API具有平台无关性,不与特性的文件
    系统相耦合,另外它还提供了标准文件系统的SPI,供各个个服务提供商扩展实现:
  • 提供AIO功能,支持基于文件的异步I/0操作和针对网络终接字的异步操作:
    完成JSR-51定义的通道功能,包括对配置和多播数据报的支持等。

总结

解了UNIX网络编程的5种I/O模型,学习了I/0多路复用

技术的基础知识。通过对JavaI/O演进历史的总结和介绍,相信大家对Java的I/O演进有

了一个更加直观的认识。

相关推荐
文丑颜不良啊1 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang2 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪2 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息3 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼3 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff4 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff5 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
David猪大卫5 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
SL_staff6 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品
nice_lcj5206 小时前
【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端
java·后端·spring·spring ai·ai应用开发