Java IO和NIO的区别

Java NIO是什么?

Java提供了一个叫作NIO(New I/O)的第二个I/O系统,NIO提供了与标准I/O API不同的I/O处理方式。它是Java用来替代传统I/O API(自Java 1.4以来)。
它支持面向缓冲的,基于通道的I/O操作方法。 随着JDK 7的推出,NIO系统得到了扩展,为文件系统功能和文件处理提供了增强的支持。 由于NIO文件类支持的这些新的功能,NIO被广泛应用于文件处理。
NIO为Java程序员实现高速I/O,而不使用自定义本机代码。 NIO将填充,排放缓冲区等的时间性I/O活动移回操作系统,从而大大提高了操作速度。

Java IO和NIO比较

下面表格列出了Java IO和NIO之间的主要区别:

IO NIO
基于阻塞I/O操作 基于非阻塞I/O操作
面向流的 面向缓存的
通道不可用 通道可用于非阻塞I/O操作
选择器不可用 选择器可用于非阻塞I/O操作
阻塞与非阻塞I/O

阻塞I/O
阻塞IO等待数据写入或返回前的读取。Java IO的各种流是阻塞的。这意味着当线程调用write()或read()时,线程会被阻塞,直到有一些数据可用于读取或数据被完全写入。
非阻塞I/O
非阻塞IO不等待返回前读取或写入数据。 Java NIO非阻塞模式允许线程请求向通道写入数据,但不等待它被完全写入。允许线程继续进行,并做其他事情。

面向流与面向缓冲

面向流
Java IO是面向流的I/O,这意味着我们需要从流中读取一个或多个字节。它使用流来在数据源/槽和java程序之间传输数据。使用此方法的I/O操作较慢。
面向缓冲
Java NIO是面向缓存的I/O方法。 将数据读入缓冲器,使用通道进一步处理数据。 在NIO中,使用通道和缓冲区来处理I/O操作。
通道和流之间的主要区别是:

  • 流可以用于单向数据传输。
  • 通道提供双向数据传输。

因此,通过在java NIO中引入通道,可以执行非阻塞I/O操作。

通道(Channels)

在Java NIO中,通道是在实体和字节缓冲区之间有效传输数据的媒介。 它从一个实体读取数据,并将其放在缓冲区块中以供消费。
通道作为Java NIO提供的网关来访问I/O机制。通常,通道与操作系统文件描述符具有一对一关系,用于提供平台独立操作功能。

选择器(Selectors)

在Java NIO中,选择器是可选择通道的多路复用器,可用作可以进入非阻塞模式的特殊类型的通道。它可以检查一个或多个NIO通道,并确定哪个通道准备好进行通信,即读取或写入。
选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转自 http://www.ibm.com/developerworks/cn/education/java/j-...
    抓兔子的猫阅读 2,508评论 0 22
  • Java NIO与IO的区别和比较 J2SE1.4以上版本中发布了全新的I/O类库。本文将通过一些实例来简单介绍N...
    cs_yale阅读 3,346评论 2 7
  • Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java I...
    JackChen1024阅读 7,964评论 1 143
  • 朋友的五年恋情结束了~ 昨天她很洒脱的在朋友圈写了一段告别的话。态度很洒脱,但是我却知道她天天忍住不哭专心工作的样...
    颖颖_江小湖阅读 208评论 0 0
  • 不再为一些琐事纠结,徘徊,甚至懊恼! 已然懂得,大凡世间事,都是处于变化之中。世界不是静止的,一直在动。同一件事,...
    走过吴桥阅读 479评论 27 44

友情链接更多精彩内容