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

相关推荐
守护者170几秒前
JAVA学习-练习试用Java实现“实现一个Hadoop程序,使用Hive进行复杂查询和数据筛查”
java·学习
程序员 小柴6 分钟前
docker的与使用
java·docker·eureka
ゞ 正在缓冲99%…10 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
Seven9725 分钟前
【Guava】并发编程ListenableFuture&Service
java
WannaRunning25 分钟前
浅谈Tomcat数据源连接池
java·oracle·tomcat
forestsea33 分钟前
使用 Spring Boot 和 GraalVM 的原生镜像
java·spring boot·spring native·原生映像
逸狼35 分钟前
【JavaEE进阶】Spring AOP入门
java·java-ee
色空大师39 分钟前
【idea】实用插件
java·ide·intellij-idea
栗筝i1 小时前
Spring 核心技术解析【纯干货版】- XIX:Spring 日志模块 Spring-Jcl 模块精讲
java·后端·spring
小天努力学java1 小时前
【面试题】如何用两个线程轮流输出0-200的值
java·开发语言