“关于NIO”的版本间差异
跳到导航
跳到搜索
无编辑摘要 |
无编辑摘要 |
||
第2行: | 第2行: | ||
== 关于 == | == 关于 == | ||
Java NIO,即“'''New I/O'''”(另一说“'''No-Blocking I/O''' | Java NIO,即“'''New I/O'''”(另一说“'''No-Blocking I/O'''”):采用'''内存映射文件'''的方式来处理输入输出:NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样访问文件了。 | ||
*(相关内容:[http://tutorials.jenkov.com/java-nio/index.html?spm=a2c6h.12873639.0.0.3e1ba7fdKRM8ja Java NIO Tutorial],网上资料大多来自于此) | |||
* NIO与标准IO不同:'''NIO支持面向缓冲区的、基于通道的IO操作''',以更加高效的方式进行文件的读写操作。 | === 与 IO === | ||
NIO与标准IO不同:'''NIO支持面向缓冲区的、基于通道的IO操作''',以更加高效的方式进行文件的读写操作。 | |||
*(“旧”的I/O包已经使用NIO重新实现过,“即使我们不显式的使用NIO编程,也能从中受益”) | *(“旧”的I/O包已经使用NIO重新实现过,“即使我们不显式的使用NIO编程,也能从中受益”) | ||
*(NIO子系统不会取代java.io包中可用的基于流的I/O类) | |||
{| class="wikitable" | {| class="wikitable" | ||
! IO !! NIO | ! IO !! NIO | ||
|- | |- | ||
| | | 面向流(Stream Oritented) | ||
| | | 面向缓冲区(Buffer Oritented) | ||
|- | |||
| 阻塞IO(Blocking IO) | |||
| 非阻塞IO(None Blocking IO) | |||
|- | |- | ||
| | | 无 | ||
| | | 选择器(Selecters) | ||
|} | |||
=== NIO 包 === | |||
从JDK1.4开始提供的一系列改进的输入/输出处理,这些类都被放在java.nio包及子包下: | |||
:[[File:java.nio相关包.png|300px]] | |||
{| class="wikitable" | |||
! 包名称 !! 使用/目的 | |||
|- | |||
| java.nio || NIO系统的顶级包,NIO系统封装了各种类型的缓冲区。 | |||
|- | |||
| java.nio.charset || 封装了字符集,并且还支持分别将字符转换为字节和字节到编码器和解码器的操作。 | |||
|- | |||
| java.nio.charset.spi || 用于支持字符集服务提供者 | |||
|- | |||
| java.nio.channels || 支持通道,这些通道本质上是打开I/O连接。 | |||
|- | |||
| java.nio.channels.spi || 用于支持频道的服务提供者 | |||
|- | |||
| java.nio.file || 提供对文件的支持 | |||
|- | |||
| java.nio.file.spi || 用于支持文件系统的服务提供者 | |||
|- | |||
| java.nio.file.attribute || 用于提供对文件属性的支持 | |||
|} | |} | ||
第23行: | 第51行: | ||
# 网络I/O:NIO的优势体现; | # 网络I/O:NIO的优势体现; | ||
== NIO == | == IO:同步、异步,阻塞、非阻塞 == | ||
(见[https://blog.csdn.net/historyasamirror/article/details/5778378 IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)])<br/> | |||
== NIO 组件 == | |||
Java NIO 由以下几个核心部分组成: | Java NIO 由以下几个核心部分组成: | ||
# “'''Buffer'''”: | # “'''Buffer'''”: | ||
第32行: | 第63行: | ||
=== Channel === | |||
第39行: | 第70行: | ||
=== Buffer === | |||
=== | |||
第60行: | 第85行: | ||
== Scatter / Gather == | |||
分散(scatter) | |||
聚集(gather) | |||
== Channel to Channel Transfers == | |||
== 常用Channel == | |||
FileChannel | |||
DatagramChannel | |||
SocketChannel | |||
ServerSocketChannel | |||
== Java NIO非阻塞式服务器 == | |||
== 其他 == | |||
Pipe | |||
Path | |||
== | Files | ||
AsynchronousFileChannel |
2021年1月3日 (日) 05:03的版本
关于
Java NIO,即“New I/O”(另一说“No-Blocking I/O”):采用内存映射文件的方式来处理输入输出:NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样访问文件了。
- (相关内容:Java NIO Tutorial,网上资料大多来自于此)
与 IO
NIO与标准IO不同:NIO支持面向缓冲区的、基于通道的IO操作,以更加高效的方式进行文件的读写操作。
- (“旧”的I/O包已经使用NIO重新实现过,“即使我们不显式的使用NIO编程,也能从中受益”)
- (NIO子系统不会取代java.io包中可用的基于流的I/O类)
IO | NIO |
---|---|
面向流(Stream Oritented) | 面向缓冲区(Buffer Oritented) |
阻塞IO(Blocking IO) | 非阻塞IO(None Blocking IO) |
无 | 选择器(Selecters) |
NIO 包
从JDK1.4开始提供的一系列改进的输入/输出处理,这些类都被放在java.nio包及子包下:
包名称 | 使用/目的 |
---|---|
java.nio | NIO系统的顶级包,NIO系统封装了各种类型的缓冲区。 |
java.nio.charset | 封装了字符集,并且还支持分别将字符转换为字节和字节到编码器和解码器的操作。 |
java.nio.charset.spi | 用于支持字符集服务提供者 |
java.nio.channels | 支持通道,这些通道本质上是打开I/O连接。 |
java.nio.channels.spi | 用于支持频道的服务提供者 |
java.nio.file | 提供对文件的支持 |
java.nio.file.spi | 用于支持文件系统的服务提供者 |
java.nio.file.attribute | 用于提供对文件属性的支持 |
(为什么学习NIO)
IO操作往往在两个场景下会用到:
- 文件I/O
- 网络I/O:NIO的优势体现;
IO:同步、异步,阻塞、非阻塞
NIO 组件
Java NIO 由以下几个核心部分组成:
- “Buffer”:
- “Channel”:
- “Selector”:
NIO操作面向缓冲区,数据从Channel读取到Buffer缓冲区,随后在Buffer中处理数据:
(传统的IO的操作面向数据流:每次从流中读一个或多个字节,直至完成,不涉及数据缓存)
Channel
Buffer
Selector
Scatter / Gather
分散(scatter) 聚集(gather)
Channel to Channel Transfers
常用Channel
FileChannel DatagramChannel SocketChannel ServerSocketChannel
Java NIO非阻塞式服务器
其他
Pipe Path Files AsynchronousFileChannel