java NIO基礎知識

java NIO(New IO)是一個可以替代標準Java IO API的IO API(Java1.4開始),Java NIO提供了與標準IO不同的IO工作方式。NIO彌補了原來的I/O的不足,它在標準Java代碼中提供了高速的、面向塊的I/O。通過定義包含數據的類,以及通過以塊的形式處理這些數據,NIO不用使用本機代碼就可以利用低級優化,這是原來的1/O包無法做到的。

I/O簡介
在java編程中,直到最近一直使用流的方式完成I/O。所有I/O都被視爲單個的字節的移動,通過一個稱爲Stream的對象一次移動一個字節。
NIO與原來的I/O有同樣的作用和目的,但是它使用不同的方式,即:塊I/O。快I/O的效率可以比流I/O高很多。
使用NIO的目的
NIO的創建目的是爲了讓Java程序員可以實現高速I/O而無需編寫自定義的本機代碼。NIO將最耗時的I/O操作(即填充和提取緩衝區)轉移回操作系統,因而可以極大地提高速度。
流與塊的比較
面向流的I/O系統一次一個字節地處理數據。一個輸入流產生一個字節的數據,一個輸出流消費一個字節的數據。爲流式數據創建過濾器非常容易。鏈接幾個過濾器,以便每個過濾器只負責單個複雜處理機制的一部分,這也是相對簡單的。不利的一面是,面向流的I/O通常相當慢。
一個面向塊的I/O系統以塊的形式處理數據。每一個操作都在一步中產生或消費一個數據塊。按塊處理數據比按字節(流式)處理數據要快得多。但是面向塊的I/O缺少一些面向流的I/O所具有的優雅性和簡單性。

Java NIO的核心組成
Java NIO由以下核心部分組成:Channels、Buffers、Selectors。雖然除此之外,還有很多類和組件,但在我看來,Channels、Buffers、Selectors構成了核心的API。其他組件,如Pipe和FileLock,只不過是與三個核心組件共同使用的工具類。

Channel和Buffer
Channel有點像流,數據可以從Channel讀到Buffer中,也可以從Buffer寫到Channel中。如圖:
這裏寫圖片描述

Channel和Buffer有好幾種類型,如下是Java NIO的一些主要Channel的實現:

  1. FileChannel
  2. DatagramChannel
  3. SocketChannel
  4. ServerSocketChannel

這些通道涵蓋了UDP和TCP網絡IO,以及文件IO。
以下是Java NIO裏關鍵的Buffer實現:

  1. ByteBuffer
  2. CharBuffer
  3. DoubleBuffer
  4. FloatBuffer
  5. IntBuffer
  6. LongBuffer
  7. ShortBuffer

這些Buffer覆蓋了你能通過IO發送的基本數據類型:byte、short、int、long、float、double、char。
Java NIO還有個MappedByteBuffer,用於表示內存映射文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章