1. 程式人生 > >java學習-NIO(一)簡介

java學習-NIO(一)簡介

I/O簡介

在 Java 程式設計中,直到最近一直使用 流 的方式完成 I/O。所有 I/O 都被視為單個的位元組的移動,通過一個稱為 Stream 的物件一次移動一個位元組。流 I/O 用於與外部世界接觸。它也在內部使用,用於將物件轉換為位元組,然後再轉換回物件。

Java NIO即Java Non-blocking IO(Java非阻塞I/O),因為是在Jdk1.4之後增加的一套新的操作I/O工具包,所以一般會被叫做Java New IO。NIO是為提供I/O吞吐量而專門設計,其卓越的效能甚至可以與C媲美。NIO是通過Reactor模式的事件驅動機制來達到Non blocking的,那麼什麼是Reactor模式呢?Reactor翻譯成中文是“反應器”,就是我們將事件註冊到Reactor中,當有相應的事件發生時,Reactor便會告知我們有哪些事件發生了,我們再根據具體的事件去做相應的處理。

NIO 與原來的 I/O 有同樣的作用和目的,但是它使用不同的方式–塊I/O。塊 I/O 的效率可以比流 I/O 高許多。NIO 的建立目的是為了讓 Java 程式設計師可以實現高速 I/O 而無需編寫自定義的本機程式碼。NIO 將最耗時的 I/O 操作(即填充和提取緩衝區)轉移回作業系統,因而可以極大地提高速度。

面向流 的 I/O 系統一次一個位元組地處理資料。一個輸入流產生一個位元組的資料,一個輸出流消費一個位元組的資料。為流式資料建立過濾器非常容易。連結幾個過濾器,以便每個過濾器只負責單個複雜處理機制的一部分,這樣也是相對簡單的。不利的一面是,面向流的 I/O 通常相當慢。

一個 面向塊 的 I/O 系統以塊的形式處理資料。每一個操作都在一步中產生或者消費一個數據塊。按塊處理資料比按(流式的)位元組處理資料要快得多。但是面向塊的 I/O 缺少一些面向流的 I/O 所具有的優雅性和簡單性。

NIO介紹

NIO有三個核心模組:Selector(選擇器)、Channel(通道)、Buffer(緩衝區),另外java.nio.charsets包下新增的字符集類也是nio一個重要的模組,但個人覺得不算是NIO的核心,只是一個供NIO核心類使用的工具類。

通道和緩衝區

什麼是通道

通道是對原 I/O 包中的流的模擬。到任何目的地(或來自任何地方)的所有資料都必須通過一個 Channel 物件。一個 Buffer 實質上是一個容器物件。傳送給一個通道的所有物件都必須首先放到緩衝區中;同樣地,從通道中讀取的任何資料都要讀到緩衝區中。

Channel是一個物件,可以通過它讀取和寫入資料。拿 NIO 與原來的 I/O 做個比較,通道就像是流。
正如前面提到的,所有資料都通過 Buffer 物件來處理。你永遠不會將位元組直接寫入通道中,相反,你是將資料寫入包含一個或者多個位元組的緩衝區。同樣,你不會直接從通道中讀取位元組,而是將資料從通道讀入緩衝區,再從緩衝區獲取這個位元組。

下面是JAVA NIO中的一些主要Channel的實現:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

正如你所看到的,這些通道涵蓋了UDP 和 TCP 網路IO,以及檔案IO。

什麼是緩衝區

Buffer 是一個物件, 它包含一些要寫入或者剛讀出的資料。 在 NIO 中加入 Buffer 物件,體現了新庫與原 I/O 的一個重要區別。在面向流的 I/O 中,將資料直接寫入或者將資料直接讀到 Stream 物件中。在 NIO 庫中,所有資料都是用緩衝區處理的。在讀取資料時,它是直接讀到緩衝區中的。在寫入資料時,它是寫入到緩衝區中的。任何時候訪問 NIO 中的資料,您都是將它放到緩衝區中。緩衝區實質上是一個數組。通常它是一個位元組陣列,但是也可以使用其他種類的陣列。但是一個緩衝區不 僅僅 是一個數組。緩衝區提供了對資料的結構化訪問,而且還可以跟蹤系統的讀/寫程序。

Buffer與chennel的關係如下:

最常用的緩衝區型別是 ByteBuffer。一個 ByteBuffer 可以在其底層位元組陣列上進行 get/set 操作(即位元組的獲取和設定)。ByteBuffer 不是 NIO 中唯一的緩衝區型別。事實上,對於每一種基本 Java 型別都有一種緩衝區型別:

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

每一個 Buffer 類都是 Buffer 介面的一個例項。 除了 ByteBuffer,每一個 Buffer 類都有完全一樣的操作,只是它們所處理的資料型別不一樣。因為大多數標準 I/O 操作都使用 ByteBuffer,所以它具有所有共享的緩衝區操作以及一些特有的操作。

什麼是Selector

在併發型伺服器程式中使用NIO,實際上是通過網路事件驅動模型實現的。我們應用Select 機制,不用為每一個客戶端連線新啟執行緒處理,而是將其註冊到特定的Selector 物件上,這就可以在單執行緒中利用Selector 物件管理大量併發的網路連線,更好的利用了系統資源;採用非阻塞I/O的通訊方式,不要求阻塞等待I/O 操作完成即可返回,從而減少了管理I/O 連線導致的系統開銷,大幅度提高了系統性能。

當有讀或寫等任何註冊的事件發生時,可以從Selector 中獲得相應的SelectionKey , 從SelectionKey 中可以找到發生的事件和該事件所發生的具體的SelectableChannel,以獲得客戶端傳送過來的資料。由於在非阻塞網路I/O 中採用了事件觸發機制,處理程式可以得到系統的主動通知,從而可以實現底層網路I/O無阻塞、流暢地讀寫,而不像在原來的阻塞模式下處理程式需要不斷迴圈等待。使用NIO,可以編寫出效能更好、更易擴充套件的併發型伺服器程式。

這是在一個單執行緒中使用一個Selector處理4個Channel的圖示:

要使用Selector,得先向Selector註冊Channel,然後呼叫它的select()方法。這個方法會一直阻塞到某個註冊的通道有事件就緒。一旦這個方法返回,執行緒就可以處理這些事件,事件的例子比如有新連線進來或是資料接收等。

相關推薦

java學習-NIO()簡介

I/O簡介 在 Java 程式設計中,直到最近一直使用 流 的方式完成 I/O。所有 I/O 都被視為單個的位元組的移動,通過一個稱為 Stream 的物件一次移動一個位元組。流 I/O 用於與外部世界接觸。它也在內部使用,用於將物件轉換為位元組,然後再轉換回

Java NIO ()--簡介

一、簡介 Java NIO (New IO)是JDK1.4後引入的新輸入/輸出API,提供基於緩衝區(buffer)的塊寫入/讀取,而以前的I/O是基於流(Stream)的方式,NIO基於塊的IO操作,將最耗時的快取區讀取和填充交由底層作業系統實現,因此速度上要快得多;主要

java學習) 環境搭建、hello world的demo

環境變量 網上 類庫 .com java開發 www cnblogs rgs .class   本程序媛搞前端的,上班偶有空閑,不妨來學習學習,不然怎麽包養小白臉,走上人生巔峰?   說實話,每個語言都相通,有了javascript的基礎,並且有了兩三年跟java打交道的經

Java學習筆記

包括 打包 nbsp 程序 學習 dev java學習筆記 代碼 解釋 JVM 即Java Virtual machine,Java虛擬機,用來實現平臺無關性。 編譯器把源程序編譯成虛擬機可以理解的目標代碼;解釋器把目標代碼解釋成硬件可以理解的代碼。 JRE 即Java

Java學習)基礎概述

java 所在 應用 enter 代碼實現 ase 產品 stand 就是 寫代碼: 1,明確需求。我要做什麽? 2,分析思路。我要怎麽做?1,2,3。 3,確定步驟。每一個思路部分用到哪些語句,方法,和對象。 4,代碼實現。用具體的java語言代碼把思路體現出來。 學

關於最近java學習

編程 編譯 關於 識別 興趣 進展 只讀 三種 print   學習java也一個月多了,我這個人吧總感覺格局有點小,太小家子氣,在學習新東西的過程中我開始逐漸對自己有一些認識吧。首先就是學習的進度不夠快,總是執著與基礎,就像高中的時候吧,雖然當時在我們班我的成績足夠好了,

Java學習

exc 換行符 種類型 ati short style {} package gpo 在Eclipse中使用快捷鍵: main+ Alt+/ 得到publi static void main(String[] args){} sysout+Alt+/ 得到System.ou

Java學習筆記:Java開發環境搭建

默認安裝 進制 二進制文件 text ase www. java學習 span home Java開發環境搭建 第一步:安裝JDK 1.下載地址:http://www.oracle.com/technetwork/java/javase/downloads 非

Java學習記錄

計算機基礎知識     ①計算機(Computer)全稱:電子計算機,俗稱電腦。是一種能夠按照程式執行,自動、高速處理海量資料的現代化智慧電子裝置。由硬體和軟體所組成,沒有安裝任何軟體的計算機稱為裸機。常見的形式有臺式計算機、筆記本計算機、大型計算機等。 &nb

Java學習階段:2.CSS

目錄 瞭解CSS 五大CSS選擇器 CSS匯入方式   瞭解CSS CSS 概述 CSS 指層疊樣式表 (Cascading Style Sheets) 樣式定義如何顯示 HTML 元素 樣式通常儲存在樣式表中

Java學習階段:1.HTML

目錄 瞭解HTML語言 HTML整體結構 字型標籤 表單元素 瞭解HTML語言 什麼是 HTML? HTML 是用來描述網頁的一種語言。 HTML 指的是超文字標記語言 (Hyper Text Markup Language)

Java學習階段:3.JavaScript

目錄 瞭解JavaScript JavaScript基本語法 JavaScript內部物件 JavaScript的DOM BOM 自定義函式 全域性函式 事件處理 瞭解JavaScript JavaScript 是指令碼語言 JavaScript 是一

Java學習):第一章 計算機、程式和Java概述

第一章 計算機、程式和Java概述   (1)匯流排--》    儲存裝置、記憶體、CPU、通訊裝置、輸入裝置、輸出裝置; (2)語言: 機器語言: 二進位制形式

java學習筆記java程式設計

JDK,Java Development Kit,java開發工具包; javac -version 測試設定是否正確; 學會使用Eclipse; 簡單的java應用程式 package java複習; public class FirstSample {   

JAVA 學習):16進位制字串自增的實現

JAVA學習系列,並不是從基礎去講java的知識,而是把我在學習或是工作中,一些思想、邏輯總結出來。 原先在工作中,因為測試的需要,經常要往資料庫中批量的插資料。而表的主鍵用的是UUID,是由16進位制字元加“-”組成的,還有裝置的mac地址是由16進位制字元加“:”組成的,那個時候,我剛學ja

JAVA學習記錄

描述類特徵值與傳遞 建立步驟:建立JAVA工程->工程右鍵建立包->包右鍵建立class 類 檔名和類名一致 與c++不同,每宣告一個變數無論公有或私有,格式如下public/private+型別+方法名。(字串為String) 例項化格式:類名+物

Java 學習)—— 配置環境變數

一、Java 簡介     Java是由Sun Microsystems公司於1995年5月推出的Java面向物件程式設計語言和Java平臺的總稱。由James Gosling和同事們共同研發,並在1995年正式推出。 Java分為三個體系: Ja

Java學習筆記() Java多執行緒 synchronized同步方法

1.提出問題-例項變數非執行緒安全 如果多個執行緒同時訪問1個物件的例項變數,則可能出現"非執行緒安全"問題。 1.1 何為非執行緒安全? 我的理解是多個執行緒對一個例項變數操作會出現值被更改,不同步的情況。 1.2 舉例 1.2.1 有私有變數的類HasPr

MongoDB學習筆記()簡介與安裝

[mongodb-org-3.6] name = MongoDB Repository baseurl = https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/ gpgcheck = 1 enabled = 1 gpgk

java學習-NIO(五)NIO學習總結以及NIO新特性介紹

我們知道是NIO是在2002年引入到J2SE 1.4裡的,很多Java開發者比如我還是不知道怎麼充分利用NIO,更少的人知道在Java SE 7裡引入了更新的輸入/輸出 API(NIO.2)。但是對於普通的開發者來說基本的I/O操作就夠用了,而NIO則是在處理I