欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

簡(jiǎn)單了解JAVA NIO

 更新時(shí)間:2020年07月01日 16:50:42   作者:rickiyang  
這篇文章主要介紹了JAVA NIO的的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

I/O簡(jiǎn)介

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

Java NIO即Java Non-blocking IO(Java非阻塞I/O),因?yàn)槭窃贘dk1.4之后增加的一套新的操作I/O工具包,所以一般會(huì)被叫做Java New IO。NIO是為提供I/O吞吐量而專(zhuān)門(mén)設(shè)計(jì),其卓越的性能甚至可以與C媲美。NIO是通過(guò)Reactor模式的事件驅(qū)動(dòng)機(jī)制來(lái)達(dá)到Non blocking的,那么什么是Reactor模式呢?Reactor翻譯成中文是“反應(yīng)器”,就是我們將事件注冊(cè)到Reactor中,當(dāng)有相應(yīng)的事件發(fā)生時(shí),Reactor便會(huì)告知我們有哪些事件發(fā)生了,我們?cè)俑鶕?jù)具體的事件去做相應(yīng)的處理。

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

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

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

NIO介紹

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

通道和緩沖區(qū)

什么是通道

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

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

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

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

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

什么是緩沖區(qū)

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

Buffer與channel的關(guān)系如下:

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

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

每一個(gè) Buffer 類(lèi)都是 Buffer 接口的一個(gè)實(shí)例。 除了 ByteBuffer,每一個(gè) Buffer 類(lèi)都有完全一樣的操作,只是它們所處理的數(shù)據(jù)類(lèi)型不一樣。因?yàn)榇蠖鄶?shù)標(biāo)準(zhǔn) I/O 操作都使用 ByteBuffer,所以它具有所有共享的緩沖區(qū)操作以及一些特有的操作。

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

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

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

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

以上就是簡(jiǎn)單了解JAVA NIO的詳細(xì)內(nèi)容,更多關(guān)于java NIO的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • spring boot devtools在Idea中實(shí)現(xiàn)熱部署方法

    spring boot devtools在Idea中實(shí)現(xiàn)熱部署方法

    這篇文章主要介紹了spring boot devtools在Idea中實(shí)現(xiàn)熱部署方法及注意要點(diǎn),需要的朋友可以參考下
    2018-02-02
  • Springboot啟動(dòng)后立即某個(gè)執(zhí)行方法的四種方式

    Springboot啟動(dòng)后立即某個(gè)執(zhí)行方法的四種方式

    spring項(xiàng)目如何在啟動(dòng)項(xiàng)目是執(zhí)行一些操作,在spring中能通過(guò)那些操作實(shí)現(xiàn)這個(gè)功能呢,下面這篇文章主要給大家介紹了關(guān)于Springboot啟動(dòng)后立即某個(gè)執(zhí)行方法的四種方式,需要的朋友可以參考下
    2022-06-06
  • SpringMVC post請(qǐng)求的處理

    SpringMVC post請(qǐng)求的處理

    今天小編就為大家分享一篇解決SpringMVC接收不到ajaxPOST參數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-07-07
  • Java中ThreadLocal共享變量的使用

    Java中ThreadLocal共享變量的使用

    java.lang.ThreadLocal該類(lèi)提供了線程局部變量,用于在當(dāng)前線程中共享數(shù)據(jù),本文主要介紹了Java中ThreadLocal共享變量的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Java中的Cookie和Session詳細(xì)解析

    Java中的Cookie和Session詳細(xì)解析

    這篇文章主要介紹了Java中的Cookie和Session詳細(xì)解析,客戶端會(huì)話技術(shù),服務(wù)端給客戶端的數(shù)據(jù),存儲(chǔ)于客戶端(瀏覽器),由于是保存在客戶端上的,所以存在安全問(wèn)題,需要的朋友可以參考下
    2024-01-01
  • SpringBoot項(xiàng)目將mybatis升級(jí)為mybatis-plus的方法

    SpringBoot項(xiàng)目將mybatis升級(jí)為mybatis-plus的方法

    本文主要介紹了SpringBoot項(xiàng)目將mybatis升級(jí)為mybatis-plus的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Mybatis返回Map數(shù)據(jù)方式示例

    Mybatis返回Map數(shù)據(jù)方式示例

    這篇文章主要為大家介紹了Mybatis返回Map數(shù)據(jù)方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Java中json使用方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中json使用方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式, json是個(gè)非常重要的數(shù)據(jù)結(jié)構(gòu),在web開(kāi)發(fā)中應(yīng)用十分廣泛。下面通過(guò)本文給大家講解Java中json使用方法,感興趣的朋友一起看看吧
    2017-07-07
  • SpringMVC文件上傳原理及實(shí)現(xiàn)過(guò)程解析

    SpringMVC文件上傳原理及實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了SpringMVC文件上傳原理及實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):棧

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):棧

    這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-07-07

最新評(píng)論