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)的组合来实现。

相关推荐
小小小米粒11 分钟前
Collection单列集合、Map(Key - Value)双列集合,多继承实现。
java·开发语言·windows
摇滚侠42 分钟前
expdp 查看帮助
java·数据库·oracle
:1211 小时前
java基础
java·开发语言
曹牧2 小时前
Spring:@RequestMapping注解,匹配的顺序与上下文无关
java·后端·spring
daixin88482 小时前
cursor无法正常使用gpt5.5等模型解决方案
java·redis·cursor
韦禾水3 小时前
记录一次项目部署到tomcat的异常
java·tomcat
曦月合一3 小时前
树莓派安装jdk、tomcat、vnc、谷歌浏览器开机自启等环境配置
java·tomcat·树莓派
此剑之势丶愈斩愈烈4 小时前
openssl 自建证书
java
面汤放盐4 小时前
何时使用以及何时不应使用微服务:没有银弹
java·运维·云计算
0xDevNull4 小时前
Spring Boot 自动装配:从原理到实践
java·spring boot·后端