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

相关推荐
harmful_sheep4 分钟前
Spring 为何需要三级缓存解决循环依赖,而不是二级缓存
java·spring·缓存
星辰大海的精灵6 分钟前
如何确保全球数据管道中的跨时区数据完整性和一致性
java·后端·架构
大大。9 分钟前
van-tabbar-item选中active数据变了,图标没变
java·服务器·前端
nc_kai11 分钟前
Flutter 之 每日翻译 PreferredSizeWidget
java·前端·flutter
Codebee21 分钟前
OneCode:AI时代的先锋——注解驱动技术引领开发范式变革
java
勤奋的知更鸟22 分钟前
Java 编程之状态模式
java·开发语言·状态模式
架构个驾驾32 分钟前
深入浅出MyBatis-Plus实战指南
java
SimonKing36 分钟前
解锁万能文件内容分析工具:Apache Tika
java·后端·程序员
David爱编程1 小时前
Java 的数据类型为什么分为基本类型和引用类型?
java·后端