Java NIO:NIO概述

來源:互聯網
上載者:User

標籤:通道   image   static   一個   常用   long   []   .com   images   

一.NIO中的幾個基礎概念

   在NIO中有幾個比較關鍵的概念:Channel(通道),Buffer(緩衝區),Selector(選取器)。

 1. Channel通道就是通向什麼的道路,為某個提供了渠道。在傳統IO中,我們要讀取一個檔案中的內容,通常是像下面這樣讀取的:

public class ChannelTest { public static void main(String[] args) throws IOException {    File file = new File("data.txt");    InputStream inputStream = new FileInputStream(file);    byte[] bytes = new byte[1024];    inputStream.read(bytes);    inputStream.close(); } }

這裡的InputStream實際上就是為讀取檔案提供一個通道的。

NIO 中的Channel同傳統IO中的Stream對比:

     1)傳統IO中,Stream是單向的,比如InputStream只能進行讀取操作,OutputStream只能進行寫操作。

     2)Channel是雙向的,既可用來進行讀操作,又可用來進行寫操作。

2. Buffer(緩衝區),是NIO中非常重要的一個東西,在NIO中所有資料的讀和寫都離不開Buffer。比如上面的一段代碼中,讀取的資料時放在byte數組當中,而在NIO中,讀取的資料只能放在Buffer中。同樣地,寫入資料也是先寫入到Buffer中。

3.Selector (選取器),是NIO中最關鍵的一個部分,Selector的作用就是用來輪詢每個註冊的Channel,一旦發現Channel有註冊的事件發生,便擷取事件然後進行處理。

比如看下面的這個例子:

用單線程處理一個Selector,然後通過Selector.select()方法來擷取到達事件,在擷取了到達事件之後,就可以逐個地對這些事件進行響應處理。

二. Channel

  在前面已經提到,Channel和傳統IO中的Stream很相似。

  以下是常用的幾種通道:

  • FileChannel
  • SocketChanel
  • ServerSocketChannel
  • DatagramChannel

通過使用FileChannel可以從檔案讀或者向檔案寫入資料;

通過SocketChannel,以TCP來向網路連接的兩端讀寫資料;

通過ServerSocketChanel能夠監聽用戶端發起的TCP串連,並為每個TCP串連建立一個新的SocketChannel來進行資料讀寫;

通過DatagramChannel,以UDP協議來向網路連接的兩端讀寫資料。

下面給出通過FileChannel來向檔案中寫入資料的一個例子:

public class Test { public static void main(String[] args) throws IOException { File file = new File("data.txt"); FileOutputStream outputStream = new FileOutputStream(file); FileChannel channel = outputStream.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); String string = "java nio"; buffer.put(string.getBytes()); buffer.flip(); //此處必須要調用buffer的flip方法 channel.write(buffer); channel.close(); outputStream.close(); } }

通過上面的程式會向工程目錄下的data.txt檔案寫入字串”java nio”,注意在調用channel的write方法之前必須調用buffer的flip方法,否則無法正確寫入內容,至於具體原因將在下篇博文中具體講述Buffer的用法時闡述。

三.Buffer

Buffer緩衝區,實際上是一個容器,是一個連續數組。Channel提供從檔案、網路讀取資料的渠道,但是讀取或寫入的資料都必須經由Buffer。具體看下面這張圖就理解了:

描述了從一個用戶端向服務端發送資料,然後服務端接收資料的過程。用戶端發送資料時,必須先將資料存入Buffer中,然後將Buffer中的內容寫入通道。服務端這邊接收資料必須通過Channel將資料讀入到Buffer中,然後再從Buffer中取出資料來處理。

在NIO中,Buffer是一個頂層父類,它是一個抽象類別,常用的Buffer的子類有:

  • ByteBuffer
  • IntBuffer
  • CharBuffer
  • LongBuffer
  • DoubleBuffer
  • FloatBuffer
  • ShortBuffer

如果是對於檔案讀寫,上面幾種Buffer都可能會用到。但是對於網路讀寫來說,用的最多的是ByteBuffer。

四.Selector

Selector類是NIO的核心類,Selector能夠檢測多個註冊的通道上是否有事件發生,如果有事件發生,便擷取事件然後針對每個事件進行相應的響應處理。通過用一個單線程就可以管理多個通道,也就是管理多個串連。這樣使得只有在串連真正有讀寫事件發生時,才會調用函數來進行讀寫,就大大地減少了系統開銷,並且不必為每個串連都建立一個線程,不用去維護多個線程,並且避免了多線程之間的環境切換導致的開銷。

Selector有一個關鍵類是SelectionKey,一個SelectionKey表示一個到達的事件,這2個類構成了服務端處理業務的關鍵邏輯。

 

Java NIO:NIO概述

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.