欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java的NIO与IO的详解及对比

程序员文章站 2024-03-03 19:43:10
java的nio与io的区别 nio是jdk1.4引入的异步io,nio核心部分就是三点: channel buffer selector...

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 了。

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