java中IO与NIO有什么不同

目录

[1. 阻塞与非阻塞](#1. 阻塞与非阻塞)

[2. 缓冲区(Buffer)](#2. 缓冲区(Buffer))

[3. 选择器(Selector)](#3. 选择器(Selector))

[4. 面向流与面向缓冲](#4. 面向流与面向缓冲)

[5. 非阻塞IO](#5. 非阻塞IO)


Java中的IO(Input/Output)和NIO(New I/O)都是用于处理输入和输出的API,但它们在设计和功能上有一些显著的区别。

1. 阻塞与非阻塞

  • IO(传统IO): 在IO中,所有的输入/输出操作都是阻塞的。这意味着当一个线程调用read()或write()时,它会被阻塞,直到有一些数据被读取或写入。

  • NIO(New I/O): NIO是非阻塞的。在NIO中,一个线程可以管理多个通道(Channel),并从通道中读取或写入数据。如果一个通道没有数据可用,线程不会被阻塞,而是可以继续处理其他通道。这使得一个线程能够有效地管理多个输入/输出通道。

2. 缓冲区(Buffer)

  • IO: 传统的IO是面向流的,数据直接从一个流传输到另一个流。IO并没有缓冲区的概念,而是直接从流中读取或写入。

  • NIO: NIO是面向块的。数据是在块(Buffer)中处理的。Buffer可以读取数据到其中,也可以将数据从中写入。这使得可以反复读写同一块数据,而不必每次都重新从数据源读取。

3. 选择器(Selector)

  • IO: 传统的IO没有选择器的概念。当一个线程与一个通道相关联时,它必须一直等待数据可用,无法同时处理多个通道。

  • NIO: NIO引入了选择器(Selector)的概念。一个选择器可以用一个线程处理多个通道。通过选择器,一个线程可以查询多个通道是否有数据可读或可写,从而实现高效的多路复用。

4. 面向流与面向缓冲

  • IO: 传统IO是面向流的,直接从一个流中读取一个或多个字节,或将一个或多个字节写入一个流。

  • NIO: NIO是面向缓冲的。数据被读取到一个缓冲区,然后从缓冲区中读取或写入。这种方式更加灵活,可以在缓冲区中实现对数据的更复杂的处理。

5. 非阻塞IO

  • IO: 传统IO通常是阻塞的,这意味着当一个线程尝试读取或写入数据时,它可能会被阻塞,直到操作完成。

  • NIO: NIO支持非阻塞IO。这意味着当一个线程尝试读取或写入数据时,如果没有数据可用或无法写入,它不会被阻塞,而是可以执行其他任务。这通过选择器(Selector)和通道(Channel)的组合来实现。

相关推荐
小万是个程序员6 分钟前
IDEA 配置热部署(使用idea自带功能,无需插件)
java·ide·intellij-idea
柒.梧.6 分钟前
Java核心面试题终极总结:从基础到进阶,覆盖高频考
java·开发语言·面试
计算机毕设指导67 分钟前
基于微信小程序的个性化服装搭配推荐系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea
星环处相逢8 分钟前
Docker资源限制全解析:CPU、内存、磁盘IO管控与实操指南
java·开发语言
苹果醋38 分钟前
24.记录Vue项目iview组件日期获取时间少一天
java·运维·spring boot·mysql·nginx
white-persist9 分钟前
【攻防世界】reverse | tt3441810 详细题解 WP
java·c语言·开发语言·数据结构·c++·算法·安全
@淡 定10 分钟前
MVCC(多版本并发控制)实现机制详解
java·服务器·数据库
林shir11 分钟前
Java基础1.2-idea开发工具
java·ide·intellij-idea
草莓熊Lotso14 分钟前
C++ 异常完全指南:从语法到实战,优雅处理程序错误
android·java·开发语言·c++·人工智能·经验分享·后端
init_236114 分钟前
MPLS跨域optionA 配置案例
java·开发语言·网络