JAVA IO模型

JAVA IO模型

常见的IO模型有:阻塞IO模型、非阻塞IO模型、多路复用IO模型、信号驱动IO模型、异步IO模型。

一、阻塞IO模型

阻塞IO模型是最传统的一种IO模型,就是在读写数据过程中会发生阻塞现象。当用户线程发出IO请求后,内核就会去查看数据是否准备就绪,如果没有就绪,就会等待数据就绪,此时的用户线程就处于阻塞状态。当数据就绪之后,内核就会将数据拷贝到用户线程,并返回结果给用户线程,用户线程解除block状态。

二、非阻塞IO模型

当用户线程发起一个IO请求后(如read操作),并不需要等待,而是马上得到一个结果,如果结果是error,此时用户线程就知道数据还没有准备好,接着用户线程会继续发送read操作,直到内核中的数据准备好,用户线程又发送了read操作之后,那么内核就会马上把数据拷贝到用户线程,并返回结果。非阻塞IO模型并不会阻塞线程,但是会不断地询问内核数据是否就绪,持续占用CPU,导致CPU占用率非常高,一般情况下很少使用。

// 典型的非阻塞IO模型
while(true){
    data = socket.read();
    if(data!= error){
        // 处理数据
        break;
    }
}

三、多路复用IO模型

java中的NIO实际上就是多路复用IO。多路复用IO模型中,会有一个线程不断地去轮询多个socket的状态,只有socket发出读写请求时,才会有真正的IO读写操作。

java NIO的三大核心部分:

  1. Buffer(缓冲区):每个客户端连接都会对应一个Buffer,读写数据通过缓冲区读写。

  2. Channel(通道):每个Channel用于连接Buffer和Selector,通道可以及逆行双向读写。

  3. Selector(选择器):一个选择器可以对应多个通道,用于监听多个通道的事件。Selector可以监听所有Channel是否有数据需要读取,当某个Channel有

### Java IO模型解析 Java提供了多种输入/输出(IO)处理方式来满足不同的需求。主要分为字节流和字符流两大类[^1]。 #### 字节流 字节流用于读取或写入原始二进制数据,适用于任何类型的文件操作。InputStream及其子类负责从源读取字节数组;OutputStream及其派生类则用来向目的地写出字节序列。常见的实现有FileInputStream, FileOutputStream等。 #### 字符流 当涉及到文本文件或其他基于Unicode编码的数据传输时,则更倾向于使用Reader/Writer家族成员来进行高效而便捷的操作。它们可以自动完成字符集转换工作,在内部会调用相应的底层字节流对象执行实际I/O动作。BufferedReader 和 BufferedWriter 是两个非常实用的例子,前者支持按行读取字符串并带有缓冲机制提高效率,后者允许一次性提交大量文本内容到目标位置同时也能提供缓存功能加快速度。 除了上述两种基本形式外,还有其他一些重要的概念和技术: - **NIO(New Input Output)**: 自JDK 1.4引入的新一代API集合,它不仅改进了传统阻塞模式下的性能表现,还增加了非阻塞特性以及内存映射文件的支持等功能。 - **Channels & Buffers**: NIO中最重要的组件就是通道(Channel)与缓冲区(Buffer),通过Channel可以直接访问操作系统级别的资源描述符,并利用Buffer作为中介容器传递信息给应用程序层面上的对象实例化过程之中。 ```java // 创建一个新的文件示例 import java.io.File; import java.io.IOException; public class CreateNewFileExample { public static void main(String[] args) { try { File myObj = new File("filename.txt"); if (myObj.createNewFile()) { System.out.println("File created: " + myObj.getName()); } else { System.out.println("File already exists."); } } catch (IOException e) { System.out.println("An error occurred."); e.printStackTrace(); } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值