NIO與普通IO的主要區(qū)別
| IO | NIO |
|---|---|
| 面向流(Stream Oriented) | 面向緩沖區(qū)(Buffer Oriented) |
| 阻塞IO(Blocking IO) | 非阻塞IO(Non Blocking IO) |
| (無) | 選擇器(Selectors) |
- Channels and Buffers(通道和緩沖區(qū)):標準的IO基于字節(jié)流和字符流進行操作的,而NIO是基于通道(Channel)和緩沖區(qū)(Buffer)進行操作,數(shù)據(jù)總是從通道讀取到緩沖區(qū)中,或者從緩沖區(qū)寫入到通道中。
- Asynchronous IO(異步IO):Java NIO可以讓你異步的使用IO,例如:當線程從通道讀取數(shù)據(jù)到緩沖區(qū)時,線程還是可以進行其他事情。當數(shù)據(jù)被寫入到緩沖區(qū)時,線程可以繼續(xù)處理它。從緩沖區(qū)寫入通道也類似。
- Selectors(選擇器):Java NIO引入了選擇器的概念,選擇器用于監(jiān)聽多個通道的事件(比如:連接打開,數(shù)據(jù)到達)。因此,單個的線程可以監(jiān)聽多個數(shù)據(jù)通道。
緩沖區(qū)(Buffer)
Buffer 是一個對象, 它包含一些要寫入或者要讀出的數(shù)據(jù)。在NIO 類庫中加入Buffer 對象, 體現(xiàn)了新庫與原I/O 的一個重要區(qū)別。在面向流的I/O 中, 可以將數(shù)據(jù)直接寫入或者將數(shù)據(jù)直接讀到對象中。
在NIO 厙中, 所有數(shù)據(jù)都是用緩沖區(qū)處理的。在讀取數(shù)據(jù)時, 它是直接讀到緩沖區(qū)中的: 在寫入數(shù)據(jù)時, 寫入到緩沖區(qū)中。任何時候訪問NIO 中的數(shù)據(jù), 都是通過緩沖區(qū)進行操作。
緩沖區(qū)實質(zhì)上是一個數(shù)組。通常它是一個字節(jié)數(shù)組(ByteBuffer) , 也可以使用其他種類的數(shù)組。但是一個緩沖區(qū)不僅僅是一個數(shù)組, 緩沖區(qū)提供了對數(shù)據(jù)的結(jié)構(gòu)化訪問以及維護讀寫位置(limit) 等信息。
最常用的緩沖區(qū)是ByteBuffer, 一個ByteBuffer 提供了一組功能用于操作byte 數(shù)組。除了ByteBuffer, 還有其他的一些緩沖區(qū), 事實上, 每一種Java 基本類型( 除了Boolean類型) 都對應有一種緩沖區(qū)。