当前位置: 首页 > 编程笔记 >

Java的NIO与IO的详解及对比

尉迟清野
2023-03-14
本文向大家介绍Java的NIO与IO的详解及对比,包括了Java的NIO与IO的详解及对比的使用技巧和注意事项,需要的朋友参考一下

Java的NIO与IO的区别

NIO是JDK1.4引入的异步IO,NIO核心部分就是三点:

  • Channel
  • Buffer
  • Selector

NIO与IO对比

NIO与IO的区别,总体上来说体现在三个方面:

  1. IO 基于流(Stream oriented), 而 NIO 基于 Buffer (Buffer oriented)
  2. IO 操作是阻塞的, 而 NIO 操作是非阻塞的
  3. IO 没有 selector 概念, 而 NIO 有 selector 概念.

基于 Stream 与基于 Buffer

传统的 IO 是面向字节流或字符流的, 而在 NIO 中, 我们抛弃了传统的 IO 流, 而是引入了 Channel 和 Buffer 的概念。在 NIO 中, 我只能从 Channel 中读取数据到 Buffer 中或将数据从 Buffer 中写入到 Channel。

那么什么是 基于流 呢? 在一般的 Java IO 操作中, 我们以流式的方式顺序地从一个 Stream 中读取一个或多个字节, 因此我们也就不能随意改变读取指针的位置。

而 基于 Buffer 就显得有点不同了. 我们首先需要从 Channel 中读取数据到 Buffer 中, 当 Buffer 中有数据后, 我们就可以对这些数据进行操作了。不像 IO 那样是顺序操作, NIO 中我们可以随意地读取任意位置的数据。

阻塞和非阻塞

Java 提供的各种 Stream 操作都是阻塞的, 例如我们调用一个 read 方法读取一个文件的内容, 那么调用 read 的线程会被阻塞住, 直到 read 操作完成。而 NIO 的非阻塞模式允许我们非阻塞地进行 IO 操作.。例如我们需要从网络中读取数据, 在 NIO 的非阻塞模式中, 当我们调用 read 方法时, 如果此时有数据, 则 read 读取并返回; 如果此时没有数据, 则 read 直接返回, 而不会阻塞当前线程。

selector

selector 是 NIO 中才有的概念, 它是 Java NIO 之所以可以非阻塞地进行 IO 操作的关键。通过 Selector, 一个线程可以监听多个 Channel 的 IO 事件, 当我们向一个 Selector 中注册了 Channel 后, Selector 内部的机制就可以自动地为我们不断地查询(select) 这些注册的 Channel 是否有已就绪的 IO 事件(例如可读, 可写, 网络连接完成等)。通过这样的 Selector 机制, 我们就可以很简单地使用一个线程高效地管理多个 Channel 了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 类似资料:
  • 主要内容:1 Java NIO和IO的主要区别,2 面向流与面向缓冲区,3 阻塞与非阻塞IO,4 选择器,5 NIO和IO如何影响应用程序设计,6 总结在研究Java NIO和IO API时,很快就会想到一个问题: 什么时候应该使用IO,什么时候应该使用NIO? 在本文中,我将尝试阐明Java NIO和IO之间的差异,它们的用例以及它们如何影响代码的设计。 1 Java NIO和IO的主要区别 下表总结了Java NIO和IO之间的主要区别。我将在表格后面的各节中详细介绍每种差异。 IO NIO

  • 本文向大家介绍java NIO 详解,包括了java NIO 详解的使用技巧和注意事项,需要的朋友参考一下 Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 Asynch

  • 本文向大家介绍java的IO流详细解读,包括了java的IO流详细解读的使用技巧和注意事项,需要的朋友参考一下 流,就是一系列的数据。 当不同介质之间有数据交互的时候,JAVA就使用流来实现。数据源可以是文件,还可以是数据库、网络甚至其他的程序。 比如读取文件的数据到程序中,站在程序的角度来看,就叫做输入流。 字节流(以字节的形式读取和写入数据) InputStream字节输入流同时也是抽象类,只

  • 本文向大家介绍java  Callable与Future的详解及实例,包括了java  Callable与Future的详解及实例的使用技巧和注意事项,需要的朋友参考一下 java  Callable与Future Callable与 Future 两功能是Java在后续版本中为了适应多并法才加入的,Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable

  • 本文向大家介绍java IO 字节流详解及实例代码,包括了java IO 字节流详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 java IO 字节流详解 1.         如何理解输入输出流? 这是我当初在学习Java IO这一块很难理解的一块,输入输出流我们可必须以一个为参照物:我们以内存为参照物,凡是写入内存的我们叫输入流,从内存中写出的我们叫输出流。看下面的示例图 有了这样的一

  • 本文向大家介绍JAVA-NIO之Socket/ServerSocket Channel(详解),包括了JAVA-NIO之Socket/ServerSocket Channel(详解)的使用技巧和注意事项,需要的朋友参考一下 一、ServerSocketChannel Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的Server