浅谈Java NIO

简介: 浅谈Java NIO

Java NIO(New Input/Output)是Java平台上一种全新的IO API,相较于传统的Java I/O(也称为BIO,阻塞I/O),NIO引入了非阻塞I/O和通道(Channel)的概念,以及缓冲区(Buffer)和选择器(Selector)机制,大大提升了系统的并发处理能力和性能。以下是对NIO实现原理的关键点概述:

  1. 非阻塞I/O
  • 在传统的BIO中,当调用read或write方法时,线程会一直阻塞,直到数据准备好或写出成功。而在NIO中,当调用read或write方法时,如果没有数据可读或不能立即写入,线程不会被阻塞,而是继续执行其他任务,稍后再回来看看数据是否准备就绪。
  1. 通道(Channel)
  • Channel是NIO的基础,它是连接到实体(如硬件设备、文件、网络套接字等)的抽象接口,可以用于读写数据。与传统的InputStream和OutputStream不同,通道既可以读数据也可以写数据。
  1. 缓冲区(Buffer)
  • 缓冲区是NIO中用来存储数据的区域,它是内存的一部分,可以存放不同类型的数据(如字节、字符、整数、浮点数等)。缓冲区有自己的容量、当前位置和界限,这使得NIO能够在批量处理数据时更加高效。
  • Buffer本质上是一块可以写入数据,然后可以从中读取数据的内存。
  • Buffer对象包含三个重要的属性,分别是capacity、position、limit,其中position和limit的含义取决于Buffer处在读模式还是写模式。
    – capacity:capacity是指Buffer对象的最大容量,即它可以存储的数据总量。一旦创建了一个Buffer对象并分配了容量,这个容量就不能改变。例如,如果你创建了一个容量为100的ByteBuffer,那么它最多可以存储100个字节的数据。
    – position:position是当前读写操作的当前位置。初始情况下,position设置为0。当你从Buffer中读取数据时,position会向前移动,表示已经读取了多少数据;当你往Buffer中写入数据时,position也会向前移动,表示已经写入了多少数据。position的值始终在0到limit-1之间。
    – limit:limit标记了Buffer中可以被读取或写入数据的数量边界。对于写入操作,limit等于Buffer的capacity;而对于读取操作,limit等于最后一次写入操作后的position值。也就是说,limit表示的是当前剩余可以读取的数据量或者是还能写入的最大数据量。
    – 三个属性之间的关系,如下图所示:
  1. 选择器(Selector)
  • 选择器是NIO的重要特性,它允许单个线程监控多个通道的事件(如连接打开、数据到达等)。通过注册通道到选择器,线程可以检测哪些通道准备好了读、写或有新的连接。当调用select方法时,线程会阻塞,直到至少有一个通道准备好进行所关心的操作。
    这是在一个单线程中使用一个Selector处理3个Channel的图示:
  1. 事件驱动
  • NIO基于事件驱动模型,这意味着系统不会浪费CPU周期去持续查询是否有事件发生。相反,当有事件发生时,操作系统会通知Java应用程序,这样可以极大地提高并发处理能力,特别是在大规模并发连接场景下。
  1. 堆外内存(Direct Buffers)
  • NIO还可以直接操作堆外内存,即通过DirectByteBuffer等类直接与操作系统交互,减少Java堆和内核空间之间的数据复制,进一步提高性能。

Java NIO通过非阻塞I/O、通道、缓冲区和选择器机制,实现了高效的数据传输和处理,特别适合处理高并发、低延迟的网络通信和服务端编程场景。

相关文章
|
6天前
|
存储 Java 数据处理
|
6天前
|
Java API
java中IO与NIO有什么不同
java中IO与NIO有什么不同
|
6天前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
9 2
|
6天前
|
缓存 Java API
Java NIO和IO之间的区别
NIO(New IO),这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
17 1
|
6天前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
|
6天前
|
消息中间件 存储 Java
【Java NIO】那NIO为什么速度快?
是这样的,在NIO零拷贝出现之前,一个I/O操作会将同一份数据进行多次拷贝。可以看下图,一次I/O操作对数据进行了四次复制,同时来伴随两次内核态和用户态的上下文切换,众所周知上下文切换是很耗费性能的操作。
31 1
【Java NIO】那NIO为什么速度快?
|
6天前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java NIO是一种高效I/O库,特征包括非阻塞性操作、通道(如文件、网络连接)、缓冲区和选择器。选择器监控通道状态变化,通知应用程序数据可读写,避免轮询,提升性能。示例代码展示了一个使用NIO的服务器,监听连接、读取数据并处理客户端通信。
14 1
|
6天前
|
移动开发 编解码 网络协议
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
|
6天前
|
网络协议 Java Linux
用Java来实现BIO和NIO模型的HTTP服务器(二) NIO的实现
用Java来实现BIO和NIO模型的HTTP服务器(二) NIO的实现
|
7月前
|
存储 Java API
Java NIO+示例代码
Java NIO(New IO)是 JDK 1.4 引入的一组新的 I/O API,用于支持非阻塞式 I/O 操作。相比传统的 Java IO API,NIO 提供了更快、更灵活的 I/O 操作方式,可以用于构建高性能网络应用程序。 Java NIO 的主要组成部分包括: 1. Channel:通道是一个在应用程序和文件、网络套接字之间的连接。可以通过通道来进行数据的读取和写入。 2. Buffer:缓冲区是一个容器,用于存储数据。在 NIO 中,所有的数据读取和写入都是通过缓冲区进行的。 3. Selector:选择器用于监听多个 NIO 通道的事件,如读写事件。当某个通道发生事件时,选
52 0