NIO與普通IO的主要區(qū)別
IO | NIO |
---|---|
面向流(Stream Oriented) | 面向緩沖區(qū)(Buffer Oriented) |
阻塞IO(Blocking IO) | 非阻塞IO(Non Blocking IO) |
(無) | 選擇器(Selectors) |
- Channels and Buffers(通道和緩沖區(qū)):標(biāo)準(zhǔn)的IO基于字節(jié)流和字符流進(jìn)行操作的,而NIO是基于通道(Channel)和緩沖區(qū)(Buffer)進(jìn)行操作匙姜,數(shù)據(jù)總是從通道讀取到緩沖區(qū)中,或者從緩沖區(qū)寫入到通道中。
- Asynchronous IO(異步IO):Java NIO可以讓你異步的使用IO橄务,例如:當(dāng)線程從通道讀取數(shù)據(jù)到緩沖區(qū)時(shí),線程還是可以進(jìn)行其他事情。當(dāng)數(shù)據(jù)被寫入到緩沖區(qū)時(shí)缔逛,線程可以繼續(xù)處理它画侣。從緩沖區(qū)寫入通道也類似冰悠。
- Selectors(選擇器):Java NIO引入了選擇器的概念,選擇器用于監(jiān)聽多個(gè)通道的事件(比如:連接打開棉钧,數(shù)據(jù)到達(dá))屿脐。因此,單個(gè)的線程可以監(jiān)聽多個(gè)數(shù)據(jù)通道宪卿。
緩沖區(qū)(Buffer)
Buffer 是一個(gè)對象的诵, 它包含一些要寫入或者要讀出的數(shù)據(jù)。在NIO 類庫中加入Buffer 對象佑钾, 體現(xiàn)了新庫與原I/O 的一個(gè)重要區(qū)別西疤。在面向流的I/O 中, 可以將數(shù)據(jù)直接寫入或者將數(shù)據(jù)直接讀到對象中休溶。
在NIO 厙中代赁, 所有數(shù)據(jù)都是用緩沖區(qū)處理的。在讀取數(shù)據(jù)時(shí)兽掰, 它是直接讀到緩沖區(qū)中的: 在寫入數(shù)據(jù)時(shí)芭碍, 寫入到緩沖區(qū)中。任何時(shí)候訪問NIO 中的數(shù)據(jù)孽尽, 都是通過緩沖區(qū)進(jìn)行操作窖壕。
緩沖區(qū)實(shí)質(zhì)上是一個(gè)數(shù)組。通常它是一個(gè)字節(jié)數(shù)組(ByteBuffer) 瞻讽, 也可以使用其他種類的數(shù)組。但是一個(gè)緩沖區(qū)不僅僅是一個(gè)數(shù)組速勇, 緩沖區(qū)提供了對數(shù)據(jù)的結(jié)構(gòu)化訪問以及維護(hù)讀寫位置(limit) 等信息坎拐。
最常用的緩沖區(qū)是ByteBuffer, 一個(gè)ByteBuffer 提供了一組功能用于操作byte 數(shù)組烦磁。除了ByteBuffer, 還有其他的一些緩沖區(qū), 事實(shí)上廉白, 每一種Java 基本類型( 除了Boolean類型) 都對應(yīng)有一種緩沖區(qū)个初。