1. 程式人生 > >Java NIO系列教程(一)java NIO簡介

Java NIO系列教程(一)java NIO簡介

這個系列的文章,我們開始玩一玩IO方面的知識,對於IO和NIO,我們經常會接觸到,瞭解他們的基本內容,對於我們的工作會有特別大的幫助。這篇博文我們僅僅是介紹IO和NIO的基本概念,以及一些關鍵詞。

基本概念

IO是主存和外部裝置(硬碟、終端和網路)進行資料拷貝的過程。IO是作業系統的底層功能實現,底層通過I/O指令完成對資料的操作。

java標準IO回顧

Java 標準 IO 類庫是 io 面向物件的一種抽象。基於本地方法的底層實現,我們無須關注底層實現。InputStream\OutputStream(面向位元組流 ) :一次傳送一個位元組。 Reader\Writer( 面向字元流 ) :一次一個字元。

java NIO簡介

Java NIO(New IO Non Blocking IO)是從Java1.4版本開始引入的一個新的IO API,可以替代標準的Java IO API。NIO與原來的IO有同樣的作用和目的,但是使用的方式完全不同,NIO支援面向緩衝區的、基於通道的IO操作。NIO將以更加高效的方式進行檔案的讀寫操作。

Sum官方標榜許多的特性,如下:

  • 為所有的原始型別提供 (Buffer) 快取支援。
  • 字符集編碼解碼解決方案。
  • Channel :一個新的原始 I/O 抽象。
  • 支援鎖和記憶體對映檔案的檔案訪問介面。
  • 提供多路 (non-bloking) 非阻塞式的高伸縮性網路 I/O 。

看到NIO這麼多的優點,是不是有點小激動。繼續看一下他們的區別。

Java NIO與IO的主要區別

下表總結了Java NIO和IO之間的主要差別,我會更詳細地描述表中每部分的差異。

IO NIO
面向流(Stream Oriented) 面向緩衝區(Buffer Oriented)
阻塞IO(Blocking IO) 非阻塞IO(Non Blocking IO)
(無) 選擇器(Selectors)

面向流與面向緩衝

NIO與IO之間本質的區別是,IO是面向流的,NIO是面向緩衝區的。IO面向流意味著每次從流中讀一個或多個位元組,直至讀取所有位元組,它們沒有被快取在任何地方。此外,它不能前後移動流中的資料。如果需要前後移動從流中讀取的資料,需要先將它快取到一個緩衝區。

Java NIO的緩衝導向方法略有不同。資料讀取到一個它稍後處理的緩衝區,需要時可在緩衝區中前後移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩衝區中包含所有您需要處理的資料。而且,需確保當更多的資料讀入緩衝區時,不要覆蓋緩衝區裡尚未處理的資料。

阻塞與非阻塞IO

IO的各種流是阻塞的。這意味著,當一個執行緒呼叫read() 或 write()時,該執行緒被阻塞,直到有一些資料被讀取,或資料完全寫入。該執行緒在此期間不能再幹任何事情了。

NIO是非阻塞模式的,一個執行緒從某通道傳送請求讀取資料,但是它僅能得到目前可用的資料,如果目前沒有資料可用時,就什麼都不會獲取。而不是保持執行緒阻塞,所以直至資料變的可以讀取之前,該執行緒可以繼續做其他的事情。 非阻塞寫也是如此。一個執行緒請求寫入一些資料到某通道,但不需要等待它完全寫入,這個執行緒同時可以去做別的事情。
執行緒通常將非阻塞IO的空閒時間用於在其它通道上執行IO操作,所以一個單獨的執行緒現在可以管理多個輸入和輸出通道(channel)。

選擇器(Selectors)

NIO的選擇器允許一個單獨的執行緒來監視多個輸入通道,你可以註冊多個通道使用一個選擇器,然後使用一個單獨的執行緒來“選擇”通道:這些通道里已經有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的執行緒很容易來管理多個通道。

IO與NIO的區別是很大的,但是他們又有自己的適用範圍:

  • NIO允許你用一個單獨的執行緒或幾個執行緒管理很多個channels(網路的或者檔案的),代價是程式的處理和處理IO相比更加複雜。如果你需要同時管理成千上萬的連線,但是每個連線只發送少量資料,此時NIO更合適。
  • 如果你只有少量的連線但是每個連線都佔有很高的頻寬,同時傳送很多資料,傳統的IO會更適合。

通道與緩衝區

Java NIO系統的核心在於:通道(Channel)和緩衝區(Buffer)。

Buffer:表示開啟到IO裝置(例如:檔案、套接字)的連線。

  • 是一塊連續的記憶體塊。
  • 是 NIO 資料讀或寫的中轉地。

Channel:

  • 資料的源頭或者資料的目的地
  • 用於向 buffer 提供資料或者讀取 buffer 資料 ,buffer 物件的唯一介面。
  • 非同步 I/O 支援

基本步驟:

若需要使用NIO系統,需要獲取用於連線IO裝置的通道以及用於容納資料的緩衝區,然後操作緩衝區,對資料進行處理。

Channel與Buffer的關係:
這裡寫圖片描述

簡而言之,Channel負責傳輸,Buffer負責儲存 。

總結

本篇博文都是基本概念,內容相對比較苦澀,萬事開頭難。只要開頭,下面會順風順水。

下篇博文,我們介紹通道Channel,敬請期待。