亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳細了解JAVA NIO之Buffer(緩沖區(qū))

 更新時間:2020年07月01日 17:13:24   作者:rickiyang  
這篇文章主要介紹了JAVA NIO之Buffer(緩沖區(qū))的相關資料,文中講解非常細致,幫助大家更好的學習JAVA NIO,感興趣的朋友可以了解下

當我們需要與 NIO Channel 進行交互時, 我們就需要使用到 NIO Buffer, 即數(shù)據(jù)從 Buffer讀取到 Channel 中, 并且從 Channel 中寫入到 Buffer 中。緩沖區(qū)本質上是一塊可以寫入數(shù)據(jù),然后可以從中讀取數(shù)據(jù)的內存。這塊內存被包裝成NIO Buffer對象,并提供了一組方法,用來方便的訪問該塊內存。

緩沖區(qū)基礎

Buffer 類型有:

緩沖區(qū)是包在一個對象內的基礎數(shù)據(jù)的數(shù)組,Buffer類相比一般簡單數(shù)組而言其優(yōu)點是將數(shù)據(jù)的內容和相關信息放在一個對象里面,這個對象提供了處理緩沖區(qū)數(shù)據(jù)的豐富的API。

所有緩沖區(qū)都有4個屬性:capacity、limit、position、mark,并遵循:capacity>=limit>=position>=mark>=0,下面是對這4個屬性的解釋:

  • Capacity:     容量,即可以容納的最大數(shù)據(jù)量;在緩沖區(qū)創(chuàng)建時被設定并且不能改變
  • Limit:           上界,緩沖區(qū)中當前數(shù)據(jù)量
  • Position:      位置,下一個要被讀或寫的元素的索引
  • Mark:           標記,調用mark()來設置mark=position,再調用reset()可以讓position恢復到標記的位置即position=mark

我們通過一個簡單的操作流程來說明buffer的使用,下圖是新創(chuàng)建的容量為10的緩沖區(qū)邏輯視圖:

然后進行5次調用put:

buffer.put((byte)'A').put((byte)'B').put((byte)'C').put((byte)'D').put((byte)'E')

5次調用put之后的緩沖區(qū)為:

現(xiàn)在緩沖區(qū)滿了,我們必須將其清空。我們想把這個緩沖區(qū)傳遞給一個通道,以使內容能被全部寫出,但現(xiàn)在執(zhí)行get()無疑會取出未定義的數(shù)據(jù)。我們必須將 posistion設為0,然后通道就會從正確的位置開始讀了,但讀到哪算讀完了呢?這正是limit引入的原因,它指明緩沖區(qū)有效內容的未端。這個操作 在緩沖區(qū)中叫做翻轉:buffer.flip()。

Buffer的基本用法

使用Buffer讀寫數(shù)據(jù)一般遵循以下四個步驟:

  1. 寫入數(shù)據(jù)到Buffer
  2. 調用flip()方法
  3. 從Buffer中讀取數(shù)據(jù)
  4. 調用clear()方法或者compact()方法

當向buffer寫入數(shù)據(jù)時,buffer會記錄下寫了多少數(shù)據(jù)。

一旦要讀取數(shù)據(jù),需要通過flip()方法將Buffer從寫模式切換到讀模式。在讀模式下,可以讀取之前寫入到buffer的所有數(shù)據(jù)。

一旦讀完了所有的數(shù)據(jù),就需要清空緩沖區(qū),讓它可以再次被寫入。有兩種方式能清空緩沖區(qū):調用clear()或compact()方法。clear()方法會清空整個緩沖區(qū)。compact()方法只會清除已經(jīng)讀過的數(shù)據(jù)。任何未讀的數(shù)據(jù)都被移到緩沖區(qū)的起始處,新寫入的數(shù)據(jù)將放到緩沖區(qū)未讀數(shù)據(jù)的后面。

下面我們看一段程序來看一下Buffer的基本用法:

public static void readFile(String fileName) {
   RandomAccessFile aFile = null;
   try {
    //文件流
    aFile = new RandomAccessFile(fileName, "rw");
    //將文件輸入到管道
     FileChannel inChannel = aFile.getChannel();
    //為buffer分配1024個字節(jié)大小的空間
     ByteBuffer buf = ByteBuffer.allocate(1024);
    //將buffer中的內容讀取到管道中
     int bytesRead = inChannel.read(buf);
     while (bytesRead != -1) {
       //反轉buffer,將寫模式改為讀模式
       buf.flip();
       while (buf.hasRemaining()) {
        //獲取buffer中的數(shù)據(jù)
        System.out.print((char) buf.get());
       }
      //將上次分配的1024字節(jié)的內容清空,為下次接收做準備
       buf.clear();
      //管道重新讀取buffer中的內容
       bytesRead = inChannel.read(buf);
     }
     aFile.close();
   } catch (Exception e) {
     e.printStackTrace();
   }
 }

字節(jié)緩沖區(qū)

我們將進一步觀察字節(jié)緩沖區(qū)。所有的基本數(shù)據(jù)類型都有相應的緩沖區(qū)類(布爾型除外),但字節(jié)緩沖區(qū)有自己的獨特之處。字節(jié)是操作系統(tǒng)及其I/O設備使用的基本數(shù)據(jù)類型。當在JVM和操作系統(tǒng)間傳遞數(shù)據(jù)時,將其他的數(shù)據(jù)類型拆分成構成它們的字節(jié)是十分必要的。如我們在后面的章節(jié)中將要看到的那樣,系統(tǒng)層次的I/O面向字節(jié)的性質可以在整個緩沖區(qū)的設計以及它們互相配合的服務中感受到。

直接緩沖區(qū)

我們知道操作系統(tǒng)是在內存中進行I/O操作,這些內存區(qū)域,就操作系統(tǒng)方面而言,是相連的字節(jié)序列。于是,毫無疑問,只有字節(jié)緩沖區(qū)有資格參與I/O操作。即操作系統(tǒng)會直接存取進程,那么我們現(xiàn)在在JVM中進行操作,java中的內存空間是由JVM直接進行管理,但是在JVM中,字節(jié)數(shù)組可能不會在內存中連續(xù)存儲,或者無用存儲單元收集可能隨時對其進行移動,這就不能保證I/O操作的目標是連續(xù)的。

出于這一原因,引入了直接緩沖區(qū)的概念。直接緩沖區(qū)被用于與通道和固有I/O例程交互。它們通過使用固有代碼來告知操作系統(tǒng)直接釋放或填充內存區(qū)域,對用于通道直接或原始存取的內存區(qū)域中的字節(jié)元素的存儲盡了最大的努力。

直接字節(jié)緩沖區(qū)通常是I/O操作最好的選擇。在設計方面,它們支持JVM可用的最高效I/O機制。非直接字節(jié)緩沖區(qū)可以被傳遞給通道,但是這樣可能導致性能損耗。通常非直接緩沖不可能成為一個本地I/O操作的目標。如果您向一個通道中傳遞一個非直接ByteBuffer對象用于寫入,通道可能會在每次調用中隱含地進行下面的操作:

  1. 創(chuàng)建一個臨時的直接ByteBuffer對象。
  2. 將非直接緩沖區(qū)的內容復制到臨時緩沖中。
  3. 使用臨時緩沖區(qū)執(zhí)行低層次I/O操作。
  4. 臨時緩沖區(qū)對象離開作用域,并最終成為被回收的無用數(shù)據(jù)。

視圖緩沖區(qū)

就像我們已經(jīng)討論的那樣,I/O基本上可以歸結成組字節(jié)數(shù)據(jù)的四處傳遞。在進行大數(shù)據(jù)量的I/O操作時,很又可能你會使用各種ByteBuffer類去讀取文件內容,接收來自網(wǎng)絡連接的數(shù)據(jù),等等。一旦數(shù)據(jù)到達了你的ByteBuffer,您就需要查看它以決定怎么做或者在將它發(fā)送出去之前對它進行一些操作。ByteBuffer類提供了豐富的API來創(chuàng)建視圖緩沖區(qū)。

視圖緩沖區(qū)通過已存在的緩沖區(qū)對象實例的工廠方法來創(chuàng)建。這種視圖對象維護它自己的屬性,容量,位置,上界和標記,但是和原來的緩沖區(qū)共享數(shù)據(jù)元素。但是ByteBuffer類允許創(chuàng)建視圖來將byte型緩沖區(qū)字節(jié)數(shù)據(jù)映射為其它的原始數(shù)據(jù)類型。例如,asLongBuffer()函數(shù)創(chuàng)建一個將八個字節(jié)型數(shù)據(jù)當成一個long型數(shù)據(jù)來存取的視圖緩沖區(qū)。

但是使用視圖緩沖區(qū)的話,一旦ByteBuffer對于視圖的維護對象產(chǎn)生非常規(guī)行的使用,那么對于工廠方法創(chuàng)建的緩沖區(qū)而言,asLongBuffer()函數(shù)就不在使用這個視窗,那么這個8字節(jié)的數(shù)據(jù)當成一個long類型的數(shù)據(jù)類型來存取的數(shù)據(jù)視圖。

以上就是詳細了解JAVA NIO之Buffer(緩沖區(qū))的詳細內容,更多關于JAVA NIO buffer(緩沖區(qū))的資料請關注腳本之家其它相關文章!

相關文章

  • java復制文件和java移動文件的示例分享

    java復制文件和java移動文件的示例分享

    本文主要介紹了java將文件夾下面的所有的jar文件拷貝到指定的文件夾下面的方法,需要的朋友可以參考下
    2014-02-02
  • Java Predicate接口定義詳解

    Java Predicate接口定義詳解

    Predicate是Java中的一個函數(shù)式接口,它代表一個判斷邏輯,接收一個輸入?yún)?shù),返回一個布爾值,這篇文章主要介紹了Java Predicate接口的定義及示例代碼,需要的朋友可以參考下
    2025-04-04
  • 利用MyBatis-Plus靈活處理JSON字段的技巧與最佳實踐

    利用MyBatis-Plus靈活處理JSON字段的技巧與最佳實踐

    這篇文章主要給大家介紹了關于利用MyBatis-Plus靈活處理JSON字段的技巧與最佳實踐,Mybatis-Plus可以很方便地處理JSON字段,在實體類中可以使用@JSONField注解來標記JSON字段,需要的朋友可以參考下
    2024-07-07
  • Springboot詳解RocketMQ實現(xiàn)消息發(fā)送與接收流程

    Springboot詳解RocketMQ實現(xiàn)消息發(fā)送與接收流程

    這篇文章主要介紹了SpringBoot整合RocketMQ實現(xiàn)消息發(fā)送和接收功能,我們使用主流的SpringBoot框架整合RocketMQ來講解,使用方便快捷,本文分步驟給大家介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • springcloud項目改名的操作方法

    springcloud項目改名的操作方法

    這篇文章主要介紹了springcloud項目改名的操作方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • SpringBoot+Redis哨兵模式的實現(xiàn)

    SpringBoot+Redis哨兵模式的實現(xiàn)

    本文主要介紹了SpringBoot+Redis哨兵模式的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • Java 線程優(yōu)先級詳解及實例

    Java 線程優(yōu)先級詳解及實例

    這篇文章主要介紹了Java 線程優(yōu)先級詳解及實例的相關資料,需要的朋友可以參考下
    2017-04-04
  • SpringBoot監(jiān)控SQL運行情況的流程步驟

    SpringBoot監(jiān)控SQL運行情況的流程步驟

    Druid是Java語言中最好的數(shù)據(jù)庫連接池,雖然?HikariCP?的速度稍快,但是,Druid能夠提供強大的監(jiān)控和擴展功能?,也是阿里巴巴的開源項目,本文給大家介紹了SpringBoot監(jiān)控SQL運行情況的流程步驟,需要的朋友可以參考下
    2024-03-03
  • Spring Boot2.X中findOne的使用詳解

    Spring Boot2.X中findOne的使用詳解

    這篇文章主要介紹了Spring Boot2.X中findOne的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java編程學習輸入輸出詳解看完快速上手

    java編程學習輸入輸出詳解看完快速上手

    這篇文章主要介紹了java編程學習輸入輸出到控制臺的知識詳解,看完就可以快速上手了,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10

最新評論