java中IO与NIO有什么不同

简介: java中IO与NIO有什么不同



       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)的组合来实现。
相关文章
|
7天前
|
Oracle NoSQL 关系型数据库
实时计算 Flink版操作报错之报错:java.lang.ClassNotFoundException: io.debezium.connector.common.RelationalBaseSourceConnector,如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
17小时前
|
存储 监控 Java
Java nio非阻塞io
Java nio非阻塞io
|
3天前
|
存储 Java API
Java IO流
Java IO流
19 2
|
6天前
|
存储 Java
Java IO流:深入解析与技术应用
Java IO流:深入解析与技术应用
253 1
|
7天前
|
存储 Java 编译器
Java文件IO操作基础
Java文件IO操作基础
6 0
|
8天前
|
存储 Java API
【JAVA学习之路 | 进阶篇】IO流及流的分类
【JAVA学习之路 | 进阶篇】IO流及流的分类
|
15天前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
19 2
|
15天前
|
存储 Java 数据安全/隐私保护
从零开始学习 Java:简单易懂的入门指南之IO字符流(三十一)
从零开始学习 Java:简单易懂的入门指南之IO字符流(三十一)
|
15天前
|
存储 缓存 Java
【Java IO系列】那字节流和字符流有什么区别?
而如果使用缓存流,一次性从文件里读取多个字节到缓存中,可以减少系统调用同时也减少了磁盘读取,提高了读取的效率。所以字符流是一个很方便的流了,没有必要把一个方便的流转换成一个不方便的流。,涉及到用户空间和内核空间之间的上下文切换,这些切换是很昂贵的。从输入流读取下一个数据字节,值字节以0到255范围内的。好的面试官,Java IO有两个参与对象,一个是。,这个基类提供了3个方法可以来读取字节流。,同样是提供了3个方法来支持字符流读取。好的,有这些不同之处,主要是3个方面。是这样的,虽然字节流比字符流的。
21 1
【Java IO系列】那字节流和字符流有什么区别?
|
6月前
|
存储 移动开发 Java
[java进阶]——IO流基本字节流和字符流,字符流中的缓冲流,递归实现多级文件拷贝
[java进阶]——IO流基本字节流和字符流,字符流中的缓冲流,递归实现多级文件拷贝