Java NIO 概述(Channel、Buffer、Selector)

简介: Java NIO (New IO 或 Non Bloking IO) 是从 Java 1.4 版本开始引入一个新的 IO API, 可以替代标准的 Java IO API。NIO 全面支持面向缓冲区的、基于通道的 IO 操作。NIO 将以高效的方式进行文件的读写操作。

阻塞 IO


通常在进行同步 I/O 操作时,如果读取数据,代码会阻塞直至有可供读取的数据。同样,写入调用将会阻塞直至数据能够写入。传统的 Server/Client 模式会基于 TPR (Thread per Request ), 服务器会为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求。这种模式带来的问题就是线程数量的急剧增加,大量的线程会增大服务的开销。大多数的实现为了避免这个问题,采用了线程池模型,并设置线程池的最大数量,这个带来了新的问题,如果线程池中有 100 个线程,而有 100个用户都在进行大文件下载,会导致 101 个用户的请求无法及时处理,即便第 101 个用户指向请求一个几 kb 大小的页面。传统的 Server /Client 模式如下图所示


image.png


非阻塞 IO(NIO)


NIO 中非阻塞 I/O 采用了基于 Reactor 模式的工作方式, I/O 调用不会被阻塞, 相反是注册感兴趣的 I/O 事件,如可读数据到达,新的套接字连接等等,在发生特定的事件时,系统再通知我们。NIO 中实现非阻塞 I/O 的核心对象就是 Selector 。


Selector 就是注册各种 I / O 时间地方,而且当我们感兴趣的事件发生时,就是这个对象告诉我们发生的事件,如下图所示:


image.png


从图中可以看到,当有读,或者写等任何注册事件发生时,可以从 Selector 中获取响应的 SelectionKey , 同事从 SelectorKey 中恶意找到发生的事件和该事件所发生的具体 SelectableCannel 以获取客户端发送过来的数据。


非阻塞指的是 IO 本身不阻塞,但是获取 IO 事件的 select() 方法是需要阻塞等待的。区别阻塞的 IO 会阻塞在 IO 操作上,NIO 阻塞在事件获取上,没有事件就没有 IO , 从高层次来看 IO 就不阻塞了,也就是说只有 IO 已经发生那么我们才评估 IO 是否阻塞,但是 select() 阻塞的时候 IO 还没有发生,何谈 IO 的阻塞呢? NIO的本质是延迟 IO 操作到真正发生 IO的时候,而不是以前只要 IO 流打开就一直等待 IO 操作。


总结:NIO 不会发生 IO 打开后阻塞,而是在 IO 发生的时候会处理,其实本质也是一种 IO 延迟阻塞。


IO NIO
面向流(Stream Oriented) 面向缓冲区(Buffer Oriented)
阻塞IO(Blocking IO) 非阻塞IO(Non Blocking IO)
(无) 选择器(Selector)


NIO 概述


Java NIO 由一下几个核心部分组成:


  • Channels


  • Buffers


  • Selectors


虽然 Java NIO 中除此之外还有很多类和组件,单 Channel, Buffer 和 Selector 构成了核心的 API 。其他组件,如 Pipe 和 FileLock , 只不过是与三个核心组件共同协作的工具类。


Channel


首先说下 Channel ,可以翻译为 “通道”Channel 和 IO 的Stream (流)是差不多的一个等级的。只是 Stream 是单向的,比如 InputStream , OutputStream. 而 Channel 是双向的,既可以用来进行读操作,又可以用来进行写操作。


NIO 中的 Channel 的主要实现有:FileChannel、DatagramChannel 、SocketChannel 和 ServerSocketChannel , 这里看名字就可以猜出来: 分别对应文件 IO 、UDP 和 TCP (Server 和 Client)。


Buffer


NIO 找那个关键 Buffer 实现有:ByteBuffer , CharBuffer , DoubleBuffer , FloatBuffer, IntBuffer, LongBuffer, ShortBUffer , 分别对应基本数据类型 : byte , char , dubbole, float , int , long , short.


Selector


Selector 运行单线程处理多个 Channel , 如果你的引用中开启了多个通道,但是每个连接的流量都很低,使用 Selector 就会很方便,例如在一个聊天服务器中,要使用 Selector, 需要向 Selector 中注册 Channel , 然后调用 select() 方法。 这个方法一直会阻塞到其注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有:新的连接进来、数据接收等。


相关文章
|
3月前
|
Java 应用服务中间件 Docker
java-web部署模式概述
本文总结了现代 Web 开发中 Spring Boot HTTP 接口服务的常见部署模式,包括 Servlet 与 Reactive 模型、内置与外置容器、物理机 / 容器 / 云环境部署及单体与微服务架构,帮助开发者根据实际场景选择合适的方案。
126 25
|
7月前
|
开发框架 移动开发 Java
课时2:Java简介(Java发展概述)
课时2:Java简介(Java发展概述) 摘要: 1. Java基础知识:介绍Java作为编程语言及其思想。 2. Java的发展历史:从1991年GREEN项目到1995年正式推出,历经网景公司、HotJava浏览器等关键节点。 3. Java的版本信息:涵盖从JDK 1.0到JDK 1.8的主要版本及特性,如Lambda表达式和模块化支持。
105 0
|
8月前
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
234 0
|
存储 算法 Oracle
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
288 125
|
10月前
|
监控 Java API
探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码
Java NIO(New IO)自Java SE 1.4引入,提供比传统IO更高效、灵活的操作,支持非阻塞IO和选择器特性,适用于高并发、高吞吐量场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),能实现多路复用和异步操作。其应用场景涵盖网络通信、文件操作、进程间通信及数据库操作等。NIO的优势在于提高并发性和性能,简化编程;但学习成本较高,且与传统IO存在不兼容性。尽管如此,NIO在构建高性能框架如Netty、Mina和Jetty中仍广泛应用。
246 3
|
10月前
|
存储 监控 Java
Java的NIO体系
通过本文的介绍,希望您能够深入理解Java NIO体系的核心组件、工作原理及其在高性能应用中的实际应用,并能够在实际开发中灵活运用这些知识,构建高效的Java应用程序。
285 5
|
11月前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
存储 网络协议 Java
Java NIO 开发
本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
197 0
Java NIO 开发
|
12月前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
136 2
|
安全 Java API
Java 18 概述:新特性一览
Java 18 作为 Java 平台的最新版本,引入了多项令人振奋的新特性和改进,包括模式匹配、记录类型、流库改进、外部函数与内存 API 以及并发处理增强。这些新功能不仅提升了开发者的生产力,还显著增强了 Java 的性能和安全性。本文将详细介绍 Java 18 的主要新特性,并通过代码示例帮助读者更好地理解和应用这些功能。
266 3

热门文章

最新文章