1. 程式人生 > >【Java NIO的深入研究6】JAVA NIO之Scatter-Gather

【Java NIO的深入研究6】JAVA NIO之Scatter-Gather

   Java NIO開始支援scatter/gather,scatter/gather用於描述從Channel(譯者注:Channel在中文經常翻譯為通道)中讀取或者寫入到Channel的操作。

   分散(scatter)從Channel中讀取是指在讀操作時將讀取的資料寫入多個buffer中。因此,Channel將從Channel中讀取的資料“分散(scatter)”到多個Buffer中。

    聚集(gather)寫入Channel是指在寫操作時將多個buffer的資料寫入同一個Channel,因此,Channel
將多個Buffer中的資料“聚集(gather)”後傳送到Channel。

   scatter gather經常用於需要將傳輸的資料分開處理的場合,例如傳輸一個由訊息頭和訊息體組成的訊息,你可能會將訊息體和訊息頭分散到不同的buffer中,這樣你可以方便的處理訊息頭和訊息體。

Scattering Reads

Scattering Reads是指資料從一個channel讀取到多個buffer中。如下圖描述:

程式碼示例如下:

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray);

注意buffer首先被插入到陣列,然後再將陣列作為channel.read()的輸入引數。read()方法按照buffer在陣列中的順序將從channel中讀取的資料寫入到buffer,當一個buffer被寫滿後,channel緊接著向另一個buffer中寫。

Scattering Reads在移動下一個buffer前,必須填滿當前的buffer,這也意味著它不適用於動態訊息(譯者注:訊息大小不固定)。換句話說,如果存在訊息頭和訊息體,訊息頭必須完成填充(例如128byte),Scattering Reads才能正常工作。

Gathering Writes

Gathering Writes是指資料從多個buffer寫入到同一個channel。如下圖描述:

程式碼示例如下:

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);
//write data into buffers
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);

buffers陣列是write()方法的入參,write()方法會按照buffer在陣列中的順序,將資料寫入到channel,注意只有position和limit之間的資料才會被寫入。因此,如果一個buffer的容量為128byte,但是僅僅包含58byte的資料,那麼這58byte的資料將被寫入到channel中。因此與Scattering Reads相反,Gathering Writes能較好的處理動態訊息。

相關推薦

Java NIO深入研究6JAVA NIOScatter-Gather

   Java NIO開始支援scatter/gather,scatter/gather用於描述從Channel(譯者注:Channel在中文經常翻譯為通道)中讀取或者寫入到Channel的操作。    分散(scatter)從Channel中讀取是指在讀操作時將讀取的資

JavaNIO的深入研究4內存映射文件I/O,大文件讀寫操作,Java nioMappedByteBuffer,高效文件/內存映射

int start lib 交換文件 bsp 沒有 res collected str time 內存映射文件能讓你創建和修改那些因為太大而無法放入內存的文件。有了內存映射文件,你就可以認為文件已經全部讀進了內存,然後把它當成一個非常大的數組來訪問。這種解決辦法能大大簡化修

深入理解JVMJAVA執行時資料區域

  JAVA中在由虛擬機器自動記憶體管理機制的幫助下,不需要在為每一個new操作區去寫配對的delete/free程式碼,不容易出現記憶體洩漏和記憶體溢位問題,有虛擬機器管理便很方便。但是如果不瞭解記憶體是如何控制的一旦出現了記憶體洩漏和記憶體溢位方面的問題,那麼排查錯誤便會非常艱

黑馬程序員濟南校區java基礎:異常

javaException: Java運行時期發生的問題就是異常。 Java中運行時發生的除了異常Exception還有錯誤Error。 異常:通常發生可以有針對性的處理方式的。 錯誤:通常發生後不會有針對性的處理方式。 Error的發生往往都是系統級別的問題,都是jvm所在系統發生的並反饋給jvm的

Java菜鳥學習總結Java基礎知識(類)

個數 修飾符 trac 空間 釋放 set 大小 成員方法 的區別 目錄 【Java菜鳥學習總結】Java基礎知識(類) 1、面向對象編程 2、類 3、static關鍵字 4、final關鍵字 【Java菜鳥學習總結】Java基礎知識(類) 1、面向對象編程 1.1

玩轉jvm系列 01Java虛擬機器的基本結構

Java虛擬機器架構圖 Java虛擬機器基本結構思維導圖 類載入子系統 類載入子系統負責從檔案系統或者網路中載入Class資訊,載入的類資訊存放於一塊稱為方法區的記憶體空間。 Java堆 Java堆是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動

java自定義註解2java自定義註解結合Spring AOP

      承接上一篇,註解應用於屬性,本篇定義了一個用於方法的註解,結合Spring AOP 實現 切面程式設計。       以下demo演示使用了SpringBoot,與SSM中使用方式大致相同,效果如下: 1、自定義註解(用

java自定義註解1java自定義註解-屬性

        關於自定義註解,以前專案種應用的不多,最近看新專案過程中發現了挺多自定義註解相關內容,使用起來比較巧妙,於是 總結了兩種方式,記錄如下:         第一種:結合反射進行屬性注入,程式碼如下:

TCP三次握手過程Java Service Wrapper簡介與使用 --- 學習中

ava Service Wrapper簡介與使用    在實際開發過程中很多模組需要獨立執行,他們並不會以web形式釋出,傳統的做法是將其壓縮為jar包獨立執行,這種形式簡單易行也比較利於維護,但是一旦伺服器重啟或出現異常時,程式往往無法自行修復或重啟。解決伺服器重啟的傳統做

第20、21天Java的內部類、異常處理機制

1 內部類 1.1 成員內部類 1.2 靜態內部類 1.3 區域性內部類 1.4 匿名內部類 2 異常處理機制 2.1 異常類的體系結構及各部分介紹 2.2

第14、15天Java SE的第一個練習---通訊錄

1 功能描述 2 聯絡人屬性 3 下載連結 1 功能描述 (輸入“A”)顯示聯絡人 (輸入“a”)按首字母顯示 按照首字母進行顯示分類: [效果如下:] A 阿磊 15559504275 W 王剛美 1832

Dr.Chen的系列問題Java多執行緒的實現操作

一、什麼是多執行緒? 多執行緒(英語:multithreading),是指從軟體或者硬體上實現多個執行緒併發執行的技術。具有多執行緒能力的計算機因有硬體支援而能夠在同一時間執行多於一個執行緒,進而提升整體處理效能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶片級多

本人禿頂程式設計師java面試遇到的坑,你都遇見過嗎?

←←←←←←←←←←←← 我都禿頂了,還不點關注! 親愛的同學們,本人因為連續幾周遭遇一定的工作壓力幾乎被壓榨的只剩一個空殼,還好經常鍛鍊有一副好身體(皮囊),算是挺過來了。為了大家年前能早早入坑馬不停蹄回到陣地給大家帶來第二期的面試坑題,有些題是大家經常被問到的,有些可能還未接觸到先可

本人禿頂程式設計師JAVA多執行緒執行緒間的通訊方式

←←←←←←←←←←←← 我都禿頂了,還不點關注! 一,介紹 本總結我對於JAVA多執行緒中執行緒之間的通訊方式的理解,主要以程式碼結合文字的方式來討論執行緒間的通訊,故摘抄了書中的一些示例程式碼。 二,執行緒間的通訊方式 ①同步 這裡講的同步是指多個執行緒通過synchro

本人禿頂程式設計師Java併發系列 | ReentrantLock原始碼分析

←←←←←←←←←←←← 我都禿頂了,還不點關注! 在Java5.0之前,協調對共享物件的訪問可以使用的機制只有synchronized和volatile。我們知道synchronized關鍵字實現了內建鎖,而volatile關鍵字保證了多執行緒的記憶體可見性。 在大多數情況下,這些

本人禿頂程式設計師Java面試題集(意思意思)

←←←←←←←←←←←← 我都禿頂了,還不點關注! 一、什麼是Spring MVC ?簡單介紹下你對springMVC的理解? Spring MVC是一個基於MVC架構的 用來簡化web應用程式開發的應用開發框架, 它是Spring的一個模組, 無需中間整合層來整合 , 它和Stru

本人禿頂程式設計師Java原始碼閱讀的真實體會(一種學習思路)

←←←←←←←←←←←← 快!點關注 剛才在論壇不經意間,看到有關原始碼閱讀的帖子。回想自己前幾年,閱讀原始碼那種興奮和成就感,不禁又有一種激動。 原始碼閱讀,我覺得最核心有三點:技術基礎+強烈的求知慾+耐心。 說到技術基礎,我打個比方吧,如果你從來沒有學過Java,或是任何一門

本人禿頂程式設計師Java程式設計師漲薪必備技術棧(1-5年必看)

←←←←←←←←←←←← 快!點關注!!! 如果你的目標僅僅是提高自己,那麼很容易實現,但是如果你的目標是成為一個偉大的程式設計師,那麼這就不簡單了。 很多人都願意說,我想變得更好,但是更好是什麼卻很模糊,而且人們也不知道該怎麼樣去做。 時間到了,提高你的程式設計技能,認真+嚴

本人禿頂程式設計師Java效能優化的47個細節(珍藏版)

在JAVA程式中,效能問題的大部分原因並不在於JAVA語言,而是程式本身。養成良好的編碼習慣非常重要,能夠顯著地提升程式效能。 1. 儘量在合適的場合使用單例 使用單例可以減輕載入的負擔,縮短載入的時間,提高載入的效率,但並不是所有地方都適用於單例,簡單來說,單例主要適用於以下三個方

本人禿頂程式設計師Java執行緒池詳解,看這篇就夠了!

←←←←←←←←←←←← 快!點關注!!! 構造一個執行緒池為什麼需要幾個引數?如果避免執行緒池出現OOM?Runnable和Callable的區別是什麼?本文將對這些問題一一解答,同時還將給出使用執行緒池的常見場景和程式碼片段。 基礎知識 Executors建立執行緒池 J