1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      JAVANIO是什么有什么用-創(chuàng)新互聯(lián)

      創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!

      成都創(chuàng)新互聯(lián)公司成立于2013年,我們提供高端成都網(wǎng)站建設成都網(wǎng)站制作成都網(wǎng)站設計、網(wǎng)站定制、全網(wǎng)整合營銷推廣小程序制作、微信公眾號開發(fā)、成都網(wǎng)站營銷服務,提供專業(yè)營銷思路、內(nèi)容策劃、視覺設計、程序開發(fā)來完成項目落地,為成都混凝土泵車企業(yè)提供源源不斷的流量和訂單咨詢。

      這篇文章主要介紹JAVA NIO是什么有什么用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

      I/O簡介

      在 Java 編程中,直到最近一直使用 流 的方式完成 I/O。所有 I/O 都被視為單個的字節(jié)的移動,通過一個稱為 Stream 的對象一次移動一個字節(jié)。流 I/O 用于與外部世界接觸。它也在內(nèi)部使用,用于將對象轉(zhuǎn)換為字節(jié),然后再轉(zhuǎn)換回對象。

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

      NIO 與原來的 I/O 有同樣的作用和目的,但是它使用不同的方式–塊I/O。塊 I/O 的效率可以比流 I/O 高許多。NIO 的創(chuàng)建目的是為了讓 Java 程序員可以實現(xiàn)高速 I/O 而無需編寫自定義的本機代碼。NIO 將最耗時的 I/O 操作(即填充和提取緩沖區(qū))轉(zhuǎn)移回操作系統(tǒng),因而可以極大地提高速度。

      面向流 的 I/O 系統(tǒng)一次一個字節(jié)地處理數(shù)據(jù)。一個輸入流產(chǎn)生一個字節(jié)的數(shù)據(jù),一個輸出流消費一個字節(jié)的數(shù)據(jù)。為流式數(shù)據(jù)創(chuàng)建過濾器非常容易。鏈接幾個過濾器,以便每個過濾器只負責單個復雜處理機制的一部分,這樣也是相對簡單的。不利的一面是,面向流的 I/O 通常相當慢。

      一個 面向塊 的 I/O 系統(tǒng)以塊的形式處理數(shù)據(jù)。每一個操作都在一步中產(chǎn)生或者消費一個數(shù)據(jù)塊。按塊處理數(shù)據(jù)比按(流式的)字節(jié)處理數(shù)據(jù)要快得多。但是面向塊的 I/O 缺少一些面向流的 I/O 所具有的優(yōu)雅性和簡單性。

      NIO介紹

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

      通道和緩沖區(qū)

      什么是通道

      通道是對原 I/O 包中的流的模擬。到任何目的地(或來自任何地方)的所有數(shù)據(jù)都必須通過一個 Channel 對象。一個 Buffer 實質(zhì)上是一個容器對象。發(fā)送給一個通道的所有對象都必須首先放到緩沖區(qū)中;同樣地,從通道中讀取的任何數(shù)據(jù)都要讀到緩沖區(qū)中。

      Channel是一個對象,可以通過它讀取和寫入數(shù)據(jù)。拿 NIO 與原來的 I/O 做個比較,通道就像是流。
      正如前面提到的,所有數(shù)據(jù)都通過 Buffer 對象來處理。你永遠不會將字節(jié)直接寫入通道中,相反,你是將數(shù)據(jù)寫入包含一個或者多個字節(jié)的緩沖區(qū)。同樣,你不會直接從通道中讀取字節(jié),而是將數(shù)據(jù)從通道讀入緩沖區(qū),再從緩沖區(qū)獲取這個字節(jié)。

      下面是JAVA NIO中的一些主要Channel的實現(xiàn):

      • FileChannel
      • DatagramChannel
      • SocketChannel
      • ServerSocketChannel
         

      正如你所看到的,這些通道涵蓋了UDP 和 TCP 網(wǎng)絡IO,以及文件IO。

      什么是緩沖區(qū)

      Buffer 是一個對象, 它包含一些要寫入或者剛讀出的數(shù)據(jù)。 在 NIO 中加入 Buffer 對象,體現(xiàn)了新庫與原 I/O 的一個重要區(qū)別。在面向流的 I/O 中,將數(shù)據(jù)直接寫入或者將數(shù)據(jù)直接讀到 Stream 對象中。在 NIO 庫中,所有數(shù)據(jù)都是用緩沖區(qū)處理的。在讀取數(shù)據(jù)時,它是直接讀到緩沖區(qū)中的。在寫入數(shù)據(jù)時,它是寫入到緩沖區(qū)中的。任何時候訪問 NIO 中的數(shù)據(jù),您都是將它放到緩沖區(qū)中。緩沖區(qū)實質(zhì)上是一個數(shù)組。通常它是一個字節(jié)數(shù)組,但是也可以使用其他種類的數(shù)組。但是一個緩沖區(qū)不 僅僅 是一個數(shù)組。緩沖區(qū)提供了對數(shù)據(jù)的結構化訪問,而且還可以跟蹤系統(tǒng)的讀/寫進程。

      Buffer與channel的關系如下:

      JAVA NIO是什么有什么用

      最常用的緩沖區(qū)類型是 ByteBuffer。一個 ByteBuffer 可以在其底層字節(jié)數(shù)組上進行 get/set 操作(即字節(jié)的獲取和設置)。ByteBuffer 不是 NIO 中唯一的緩沖區(qū)類型。事實上,對于每一種基本 Java 類型都有一種緩沖區(qū)類型:

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

      每一個 Buffer 類都是 Buffer 接口的一個實例。 除了 ByteBuffer,每一個 Buffer 類都有完全一樣的操作,只是它們所處理的數(shù)據(jù)類型不一樣。因為大多數(shù)標準 I/O 操作都使用 ByteBuffer,所以它具有所有共享的緩沖區(qū)操作以及一些特有的操作。

      什么是Selector
      在并發(fā)型服務器程序中使用NIO,實際上是通過網(wǎng)絡事件驅(qū)動模型實現(xiàn)的。我們應用Select 機制,不用為每一個客戶端連接新啟線程處理,而是將其注冊到特定的Selector 對象上,這就可以在單線程中利用Selector 對象管理大量并發(fā)的網(wǎng)絡連接,更好的利用了系統(tǒng)資源;采用非阻塞I/O的通信方式,不要求阻塞等待I/O 操作完成即可返回,從而減少了管理I/O 連接導致的系統(tǒng)開銷,大幅度提高了系統(tǒng)性能。

      當有讀或?qū)懙热魏巫缘氖录l(fā)生時,可以從Selector 中獲得相應的SelectionKey , 從SelectionKey 中可以找到發(fā)生的事件和該事件所發(fā)生的具體的SelectableChannel,以獲得客戶端發(fā)送過來的數(shù)據(jù)。由于在非阻塞網(wǎng)絡I/O 中采用了事件觸發(fā)機制,處理程序可以得到系統(tǒng)的主動通知,從而可以實現(xiàn)底層網(wǎng)絡I/O無阻塞、流暢地讀寫,而不像在原來的阻塞模式下處理程序需要不斷循環(huán)等待。使用NIO,可以編寫出性能更好、更易擴展的并發(fā)型服務器程序。

      這是在一個單線程中使用一個Selector處理3個Channel的圖示:

      JAVA NIO是什么有什么用

      要使用Selector,得先向Selector注冊Channel,然后調(diào)用它的select()方法。這個方法會一直阻塞到某個注冊的通道有事件就緒。一旦這個方法返回,線程就可以處理這些事件,事件的例子比如有新連接進來或是數(shù)據(jù)接收等。

      以上是JAVA NIO是什么有什么用的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯(lián)-成都網(wǎng)站建設公司行業(yè)資訊頻道!


      本文名稱:JAVANIO是什么有什么用-創(chuàng)新互聯(lián)
      本文鏈接:http://www.ef60e0e.cn/article/dgigjp.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        临湘市| 巴马| 寻甸| 恭城| 托克逊县| 朝阳县| 新巴尔虎左旗| 富源县| 义乌市| 股票| 浦城县| 丹阳市| 呼伦贝尔市| 桐柏县| 潜江市| 汶川县| 山丹县| 青川县| 方正县| 宾川县| 电白县| 东源县| 延边| 莱阳市| 黄浦区| 班玛县| 宁城县| 锡林浩特市| 芜湖县| 石门县| 台前县| 敖汉旗| 始兴县| 塔河县| 乐亭县| 靖西县| 新平| 合肥市| 准格尔旗| 精河县| 德庆县|