0. IO回顾
<1> IO:Input Output ( 输入 输出 )
<2> IO技术的应用:解决设备和设备之间的数据传输问题
<3> IO应用场景:图片上传、下载、打印机打印信息表、解析XML...
1. 概念
<1> 即 Java New IO
<2> 是一个全新的、JDK 1.4后提供的 IO API
<3> Java API 中提供了两套NIO,一套是针对 标准输入输出 NIO, 另一套就是 网络编程NIO
2. 作用
<1> NIO 和 IO 有相同的作用和目的,但实现方式不同
<2> 可替代标准 Java IO 的 IO API
<3> IO 是以流的方式处理数据,而NIO是以块的方式处理数据
3. 流与块的比较
<1> NIO 和 IO 最大的区别是数据打包 和 传输方式
<2> IO是以流的方式处理数据,而NIO是以块的方式处理数据
面向流的IO一次一个字节的处理数据,一个输入流产生一个字节,一个输出流就消费一个字节
面向块的IO系统以块的形式处理数据。每一个操作都在一步中,产生或消费一个数据块。 按快要比按流快得多
举例: 拿水龙头来比喻,流就像水龙头滴水,每次只有一滴
块就像水龙头往水壶放水,放满之后对一整个水壶的水进行操作
4. 新特性
对比于 Java IO, NIO具备的新特性如下:
IO | NIO |
面向流(Stream Oriented) | 面向缓冲区(Buffer Oriented) |
阻塞IO(Blocking IO) | 非阻塞IO (Non Blocking IO) |
(无) | 选择器(Selectors) |
可简单认为: IO是面向流的处理,NIO是面向块(缓冲区)的处理
面向流的 I/O 系统:一次一个字节地处理数据
一个面向块(缓冲区)的I/O系统:以块的形式处理数据
5. 核心组件
Java NIO 的核心组件包括:
<1> 通道 (Channel)
<2> 缓冲区 (Buffer)
<3> 选择器 (Selector)
在NIO中,并不是以流的方式来处理数据的,而是以buffer缓冲区 和 Channel管道配合使用 来处理数据
Selector是因为NIO可以使用异步的非阻塞模式才加入的东西
简单理解一下:
<1> Channel 管道比作铁路, buffer 缓冲区比作成火车(运载着货物)
而我们的NIO,就是通过Channel管道,运输着储存数据的 Buffer 缓冲区 来实现数据的处理
<2> 要时刻记住: Channel 不与数据打交道,它只负责运输数据。 与数据打交道的是 Buffer 缓冲区
Channel ----> 运输
Buffer ----> 数据
<3> 相对于传统IO而言, 流是单向的。
对于NIO而言,有了Channel管道这个概念,我们的读写都是双向的
(铁路上的火车能从广州去北京,自然就能从北京返还到广州)