“关于NIO”的版本间差异

来自Wikioe
跳到导航 跳到搜索
无编辑摘要
无编辑摘要
第2行: 第2行:


== 关于 ==
== 关于 ==
Java NIO,即“'''New I/O'''”(另一说“'''No-Blocking I/O'''”),从JDK1.4开始提供的一系列改进的输入/输出处理,这些类都被放在java.nio包及子包下:
Java NIO,即“'''New I/O'''”(另一说“'''No-Blocking I/O'''”):采用'''内存映射文件'''的方式来处理输入输出:NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样访问文件了。
:[[File:java.nio相关包.png|300px]]
*(相关内容:[http://tutorials.jenkov.com/java-nio/index.html?spm=a2c6h.12873639.0.0.3e1ba7fdKRM8ja Java NIO Tutorial],网上资料大多来自于此)
* NIO采用'''内存映射文件'''的方式来处理输入输出:NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样访问文件了。
 
* 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行:




=== Buffer ===


=== Channel ===




第39行: 第70行:




 
=== Buffer ===
 
=== Channel ===
 
 
 
 




第60行: 第85行:




== Scatter / Gather ==
分散(scatter)
聚集(gather)


== Channel to Channel Transfers ==


== 常用Channel ==
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel




== Java NIO非阻塞式服务器 ==


 
== 其他 ==
 
Pipe
 
Path
== NIO 与 IO ==
Files
AsynchronousFileChannel

2021年1月3日 (日) 05:03的版本


关于

Java NIO,即“New I/O”(另一说“No-Blocking I/O”):采用内存映射文件的方式来处理输入输出:NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样访问文件了。

与 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相关包.png
包名称 使用/目的
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操作往往在两个场景下会用到:

  1. 文件I/O
  2. 网络I/O:NIO的优势体现;

IO:同步、异步,阻塞、非阻塞

(见IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)

NIO 组件

Java NIO 由以下几个核心部分组成:

  1. Buffer”:
  2. Channel”:
  3. 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