Java NIO详解:从通道与缓冲区到非阻塞IO

0 下载量 190 浏览量 更新于2024-09-01 收藏 115KB PDF 举报
【Java NIO详解】 Java NIO(New Input/Output)是Java 1.4引入的一套全新的I/O API,它提供了不同于传统IO的另一种处理输入/输出的方式。NIO的核心特性包括非阻塞I/O、选择器和通道,以及缓冲区的使用。相比传统的IO模型,NIO的主要优势在于其非阻塞的特性和更高的并发性能。 **IO与NIO的比较** 1. **面向流与面向缓冲区**: - IO基于流,即数据以字节或字符序列的形式读写,每次操作只能处理一个流中的数据。 - NIO则是基于缓冲区,数据先被读取到缓冲区,然后从缓冲区读取或写入,允许批量操作。 2. **阻塞与非阻塞**: - IO是阻塞的,当读写操作未完成时,会阻塞线程,直到操作完成。 - NIO是非阻塞的,当没有数据可读或无法写入时,不会阻塞线程,而是返回一个状态,使得程序可以处理其他任务。 3. **选择器**: - IO没有选择器机制,每个连接需要单独的线程处理。 - NIO引入了选择器(Selector),单个线程可以监视多个通道,当通道准备就绪时,可以选择并处理,极大地提高了并发能力。 **通道与缓冲区** 1. **通道(Channel)**: - 通道类似于管道,是数据传输的途径,如文件通道、套接字通道等,可以从通道读取数据,也可以向通道写入数据。通道是双向的,可以同时进行读写操作。 2. **缓冲区(Buffer)**: - 缓冲区是数据的临时存储区域,有多种类型,如ByteBuffer、CharBuffer等,对应各种基本数据类型。 - 缓冲区具有固定容量,可以通过`allocate()`方法创建。数据的读写通过`put()`和`get()`方法进行,且具有`capacity`、`limit`、`position`和`mark`四个关键属性: - `capacity`:表示缓冲区的最大容量,创建后不可变。 - `limit`:表示当前可读写的界限,初始值等于`capacity`。 - `position`:表示当前读写位置,初始值为0,读写后增加。 - `mark`:用于标记当前`position`,通过`mark()`设置,`reset()`恢复。 **直接缓冲区与非直接缓冲区** - 非直接缓冲区是通过`allocate()`方法创建,存储在JVM堆内存中,效率相对较低。 - 直接缓冲区通过`allocateDirect()`创建,数据直接存储在物理内存中,减少了JVM与物理内存之间的数据复制,从而提高性能。可通过`buffer.isDirect()`判断缓冲区是否为直接缓冲区。 **使用NIO进行本地通信与网络通信** - 本地通信通常涉及文件通道,例如FileChannel,可以进行文件的读写操作。 - 网络通信则涉及到套接字通道,如SocketChannel和ServerSocketChannel,它们允许进行TCP/IP的连接和数据交换。 **代码示例** ```java ByteBuffer buffer = ByteBuffer.allocate(1024); // 分配缓冲区 // ... 使用put()存入数据 buffer.flip(); // 切换到读模式 // ... 使用get()获取数据 ``` 以上就是Java NIO的基本概念和核心特性,它为Java应用程序提供了更高效、灵活的I/O处理能力,特别适合于高并发的网络应用和服务。