就是非阻塞IO 采用多路分发方式 举个例子吧 你服务器做一个聊天室 按照以前的阻塞式IO 你必须为每个连接创建一个线程 因为当你调用如 in read buf 时 线程会阻塞在这里 而采用nio 只要注册了事件 它内部采用反应模式 当有IO事件发生时 再调度它 而不用等待在那里 参考文档 ">就是非阻塞IO 采用多路分发方式 举个例子吧 你服务器做一个聊天室 按照以前的阻塞式IO 你必须为每个连接创建一个线程 因为当你调用如 in read buf 时 线程会阻塞在这里 而采用nio 只要注册了事件 它内部采用反应模式 [更多] ### Java NIO (Non-blocking I/O) 参考文档 #### 一、JAVA NIO 简介 ##### 1. 基本概念 **IO**(Input/Output)是指计算机与外部设备(如硬盘、键盘、网络等)之间进行数据传输的过程。在操作系统层面,IO通常通过专门的指令来完成,而上层编程语言则提供了更高级别的抽象来简化这一过程,例如C语言中的`printf`和`scanf`函数,以及Java中的面向对象的IO封装。 ##### 2. Java 标准IO回顾 Java的标准IO类库是面向对象的一种抽象封装,其底层实现基于本地方法,用户无需关心具体的实现细节。Java提供了以下几种主要的IO流: - `InputStream`/`OutputStream`(字节流):一次传送一个字节。 - `Reader`/`Writer`(字符流):一次传送一个字符。 这些流都是同步阻塞式的,意味着当程序试图从流中读取数据或向流中写入数据时,如果数据不可用或目的地未准备好接收数据,则相应的线程会被阻塞,直到数据可用或目的地准备好为止。 ##### 3. NIO简介 NIO(New IO)是Java在JDK 1.4中引入的一套新的IO API。NIO的主要特点包括: - **缓存(Buffers)支持**:为所有的原始类型提供了缓存支持,以提高性能。 - **字符集编码解码**:提供了一种统一的方式来处理不同的字符集编码问题。 - **Channel**:这是一个新的原始I/O抽象,允许数据的读写操作不被阻塞。 - **文件访问接口**:支持锁和内存映射文件等功能,提高了对文件的访问效率。 - **非阻塞式I/O**:支持多路复用的非阻塞I/O,可以极大地提高程序的伸缩性和响应能力。 #### 二、NIO的核心组件 ##### 1. Buffer(缓冲) - **定义**:Buffer是NIO中用来存储不同数据类型的容器。它实际上是一块连续的内存区域,用于临时存放从Channel读取的数据或待写入Channel的数据。 - **操作步骤**: - **分配**:首先通过静态方法`allocate`分配一个Buffer。 - **写入**:通过调用`put`方法将数据写入Buffer中。 - **翻转**:通过调用`flip`方法准备将Buffer中的数据读出。 - **读取**:通过调用`get`方法从Buffer中读取数据。 - **重置**:通过调用`rewind`方法将Buffer的状态重置为可读状态。 ##### 2. Channel(通道) - **定义**:Channel是数据的源头或目的地。它是Buffer与外部设备之间数据传输的桥梁。 - **类型**: - `FileChannel`:用于文件的读写。 - `SocketChannel`:用于网络通信。 - `DatagramChannel`:用于UDP通信。 - **操作**: - **打开**:通过相应的方法打开一个Channel。 - **读写**:通过调用Channel的`read`和`write`方法来读取或写入Buffer中的数据。 - **关闭**:完成操作后关闭Channel。 #### 三、示例:文件复制 下面是一个简单的示例,演示如何使用Java NIO来复制一个文件: ```java package sample; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class CopyFile { public static void main(String[] args) throws Exception { String infile = "C:\\copy.sql"; String outfile = "C:\\copy.txt"; // 获取源文件和目标文件的输入输出流 FileInputStream fin = new FileInputStream(infile); FileOutputStream fout = new FileOutputStream(outfile); // 获取输入输出通道 FileChannel fcin = fin.getChannel(); FileChannel fcout = fout.getChannel(); // 创建缓冲区 ByteBuffer buffer = ByteBuffer.allocate(1024); while (true) { // clear 方法重设缓冲区,使它可以接受读入的数据 buffer.clear(); // 从输入通道中将数据读到缓冲区 int r = fcin.read(buffer); // read 方法返回读取的字节数,可能为零,如果该通道已到达流的末尾,则返回-1 if (r == -1) { break; } // flip 方法让缓冲区可以将新读入的数据写入另一个通道 buffer.flip(); // 从输出通道中将数据写入缓冲区 fcout.write(buffer); } // 关闭资源 fin.close(); fout.close(); } } ``` ### 总结 Java NIO通过引入非阻塞式I/O模型极大地提升了Java程序在网络通信和文件I/O方面的性能。通过对Buffer和Channel的理解与使用,开发者能够编写出更加高效和可扩展的应用程序。通过上述介绍和示例,我们可以看到NIO相比于传统的同步阻塞式IO,在处理大量并发连接时的优势更为明显,尤其是在构建高性能服务器应用时尤为突出。


























- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- Photoshop课件教案(制作文字LOGO).doc
- 数据库客户信息管理系统课程方案设计书.doc
- 学校信息化工作总结(XXxx学年).doc
- 数据库设计方案酒店管理系统.doc
- Rust系统编程实战之基础入门与实践教程
- 毕业设计(论文)--基于arm--的嵌入式系统在b超中的应用.doc
- 讲义第8单元第2节交通与通信发展带来的变化.doc
- 医院全面预算管理软件参数.docx
- 双代号网络图工作计算法例题.docx
- 2020年会计信息化的实训报告.doc
- 基因工程及其技术第4课时课件高二下学期生物选择性必修3.pptx
- 计算机级网络技术知识点.doc
- 深情款款网络营销亲子装策划书.doc
- 最新软件工程师年终工作辞职报告-软件工程师工作汇报(实用十四篇).docx
- 计算机老师述职报告范文.doc
- 维交互技术算法FPGA实现.docx


