1. 程式人生 > >NIO淺談之Buffer基本原理

NIO淺談之Buffer基本原理

NIO從整體上分類來看可以看做由這幾個部分組成:Buffer,Channel,Selector組成。本篇文章從淺談一下Buffer。

1:Buffer的型別。可以這麼來說,不同的資料型別有不同的buffer,例如ByteBuffer,IntBuffer,LongBuffer,ShortBuffer。。分別對應的資料型別為byte,int,long,short。

2:想獲取一個Buffer物件的話首先要進行buffer物件的分配,每一個Buffer類都有一個allocate的方法。具體用法:

ByteBuffer byteBuffer1 = ByteBuffer.allocate(1024);

觀察如上的程式碼,建立一個具體的Buffer物件都要使用相關的Buffer類的allocate方法。到這裡,可能就會有同學有疑問了,為什麼不能直接new出來。下面,進入ByteBuffer原始碼裡看一眼。

public abstract class ByteBuffer
    extends Buffer
    implements Comparable<ByteBuffer>
public static ByteBuffer allocate(int capacity) {
        if (capacity < 0)
            throw new IllegalArgumentException();
        return new HeapByteBuffer(capacity, capacity);
    }

估計可以看出一些門道來了,ByteBuffer是一個抽象類,allocate是抽象類中的靜態方法,通過allocate方法構造的是HeapByteBuffer物件。

由此,推斷出其他資料型別的Buffer也是一個抽象物件,通過allocate方法構造出具體的物件來。因此,又去IntBuffer原始碼中看了一眼,果不其然,如下圖:

public abstract class IntBuffer
    extends Buffer
    implements Comparable<IntBuffer>


    public static IntBuffer allocate(int capacity) {
        if (capacity < 0)
            throw new IllegalArgumentException();
        return new HeapIntBuffer(capacity, capacity);
    }

接下來,為了理解buffer的工作原理,看下buffer的三個屬性

capacity【容量】

position【位置】

limit【界限】

關於這三個屬性之間的關係,找了一個比較易懂的圖片來解釋下

左邊的代表寫入的時候,右邊的代表讀取的時候

當寫入的時候,capacity的大小代表利用allocate初始化時候的大小,代表這個快取塊的容量,最多隻能向這個快取塊中放入capacity個char,long,int,byte等等。當快取塊滿了的時候需要將其清空,才能繼續往裡面寫資料

position:代筆當前位置,初始化值為0,當一個數據寫入buffer中的時候,position會移動到下一個可插入的buffer單元,因此,position的最大值為position-1,

limit:在寫的模式下面,limit表示你最多可以向buffer裡面寫入多少個buffer資料,在寫模式下面,limit=capacity。

當切換到讀模式下面,代表最多能讀取到多少資料。因此當切花到讀模式下面,limit會被置為寫模式下面的position值。因此,你能讀取到在寫模式下面寫入的所有值。

以上的話,就是這三個屬性的具體介紹。

理解了這三個屬性之後,對於理解buffer的一些方法有很大的用處。

1:rewind方法:主要是講position置為0,因此,我們可以從頭開始重新讀取一遍資料,limit保持不變。

2:clear與compact方法。當讀取完資料之後可以通過這兩個方法來繼續讓buffer準備好繼續寫入

public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }

因此,通過clear的方法之後,會將position置為0,limit置為容器大小,相當遠將容器清空,所以這時候即使有未處理的資料也不會再被讀取出來。

但是compact方法,會將position置為 limit-position,意味著什麼,假設limit=10,position=3,意味著這個快取塊我們已經讀到第三個,還剩下7個沒有讀,最新的position=7,也就是最新一次存資料會從第7個開始寫,並且會將原來未讀取的資料copy一份放在前7個塊中。

public ByteBuffer compact() {

        System.arraycopy(hb, ix(position()), hb, ix(0), remaining());
        position(remaining());
        limit(capacity());
        discardMark();
        return this;



    }

flip 當我們從寫模式切換到讀模式的時候使用。

 public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

理解了這三個屬性的意思之後,看下程式碼直接明白什麼意思了,將limit=position。意思為在讀模式下可以讀取最多的資料是多少,position=0說明讀取開始的位置。

相關推薦

NIOBuffer基本原理

NIO從整體上分類來看可以看做由這幾個部分組成:Buffer,Channel,Selector組成。本篇文章從淺談一下Buffer。 1:Buffer的型別。可以這麼來說,不同的資料型別有不同的buffer,例如ByteBuffer,IntBuffer,LongBuffer

SEO搜尋引擎基本工作原理

搜尋引擎工作原理一共包括三個過程:網頁搜尋,預處理資訊,建立索引,那麼今天銘偉就把搜尋引擎的工作原理進行解析一篇。 1、抓取網頁。每個獨立的搜尋引擎都有自己的網頁抓取程式爬蟲(spider)。爬蟲Spider順著網頁中的超連結,從這個網站爬到另一個網站,通過超連結分析連續訪

Qt二十一log調試日誌

gms 生成文件 _file__ ica 沒有 rest delet mar 排除 一、簡單介紹 近期因調試code時,想了解程序的流程,但苦於沒有一個簡易的日誌記錄,不停使用qDebug打印輸出,而終於提交代碼時得去多次刪除信息打印,有時還會出現新改動

密碼加SALT原理

是否 get 註冊 我們 隨機 blank ref .com 使用 我們知道,如果直接對密碼進行散列,那麽黑客可以對通過獲得這個密碼散列值,然後通過查散列值字典(例如MD5密碼破解網站),得到某用戶的密碼。   加Salt可以一定程度上解決這一問題。所謂加Salt方法,就是

動態數組原理及其實現

縮小 vector 但是 align 幹什麽 可能 而不是 快速實現 param   stl中的vector是競賽中常用的容器,原因在於省內存,O(1)在後端插入和刪除、隨機下標訪問,今天就來談談它的實現。 最簡單的一個動態數組   動態數組並不是真正意義上的動態

JavaScript預編譯原理

全局變量 obj 預處理 http 對象 自然 net jet object 這兩天又把js的基礎重新復習了一下,很多不懂得還是得回歸基礎,大家都知道js是解釋性語言,就是編譯一行執行一行,但是在執行的之前,系統會做一些工作: 1,語法分析; 2,預編譯; 3,解釋執行。

JAVAEE企業級應用開發MVC 中的V-VIEW視圖

插入 第一次 開發 優點 就會 mil 是否 javaee 方便 Step1.情景概要 Hello,小夥伴們,好久不見,之前跟大家分享了三層架構與MVC思想,相信大家對於這兩塊內容有了相對清晰的個人認識了,既然我們講到了MVC,這裏我們接著這塊內容繼續往下深入,今天我們來看

HashMap 的底層原理

post key clas 只需要 文章 可能性 通過 hash沖突 app 本文整理自漫畫:什麽是HashMap? -小灰的文章 。已獲得作者授權。 HashMap 是一個用於存儲Key-Value 鍵值對的集合,每一個鍵值對也叫做Entry。這些個Entry 分散存儲

html運行原理

錯誤 如圖所示 http 找不到 資源 info 返回 一個 服務   淺談HTML運行原理,所謂的HTML簡單的來說就是一個網頁,雖然第一節就講html原理可能大家會聽不懂,就當是給一個初步印象把,至少大概知道一個網頁的運行流程是怎樣的,下面上一張圖:      大致

NIO相關概念Buffer

code 讀取 fin 進制 最大 分享 AS 容量 CI Buffer的定義: 概念上,緩沖區是包在一個對象內的基本數據元素數組。Buffer類相比一個簡單數組的優點是它將關於數據的數據內容和信息包含在一個單一的對象中。Buffer類以及它專有的子類定義了一個用於處理數據

NAT概念及原理,配置NAT 網絡地址轉換---PAT端口地址轉換;

alt 網絡拓撲圖 ffffff 問題 作用 選擇 表示 隨機 ans NAT 網絡地址轉換理論概況:NAT的概念:它將自動修改IP包頭中的源IP地址或目的IP地址。IP地址的校驗則在NAT處理過程中自動完成。它是通過內部網絡的私網IP地址翻譯成全球唯一的公網IP地址,使內

mybatis連接原理

屬於 完成 string vat 動態 template ger 滿足 apt 眾所周知數據庫連接的過程,但是最近面試的人(菜面菜),都說用的SSM框架,但是我問了一下,mybatis是怎麽連接上mysql的,基本上都會說:配置好的,直接用了,今天我來拋磚引玉

java-執行緒及NIO

這裡簡單談一下執行緒,但是要把一個執行緒談好,要結合NIO,結合鎖機制一起學習,記憶才會深刻。所以,以下說明。結合這三個方面的執行緒和NIO進行談談,鎖部分另外再談。 1、程序 1.1概念 程序=程式+執行。當把一個程式從磁碟中載入到記憶體中,cpu去運算和處理這個程序(執行起來

UART串列埠通訊(三)--字元與資料的轉換

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/solar_Lan/article/details/78093692 學串列埠通訊的應用主要是實現微控制器和電腦之間的資訊互發,可以用電腦控制微控制器的一些資訊,可以把微控制器的一些資訊狀況發給電腦

UART串列埠通訊(二)--暫存器設定

1.1 通訊的三種基本型別 常用的通訊通常可以分為單工、半雙工、全雙工通訊。 單工就是指只允許一方向另外一方傳送資訊,而另一方不能回傳資訊。比如我們的電視遙控器,我們的收音機廣播等,都是單工通訊技術。 半雙工是指資料可以在雙方之間相互傳播,但是同一時刻只能其中一方發給另外一方,

UART串列埠通訊(一)--基礎概述

通訊按照傳統的理解就是資訊的傳輸與交換。UART(Universal Asynchronous Receiver/Transmitter,即通用非同步收發器)序列通訊是微控制器最常用的一種通訊技術,通常用於微控制器和電腦之間以及微控制器和微控制器之間的通訊。 以下我們以STC98C52微控制器為

java Socket程式設計TCP基本原理

通訊原理: 1.伺服器程式建立一個ServerSocket,呼叫accept方法等待客戶機來連線。 2.客戶端程式建立一個Socket,請求與伺服器建立連線。 3.伺服器接收客戶機的連線請求,同時建立一個新的Socket與客戶端建立連線。伺服器繼續等待新的請求。 關鍵類: ServerS

spring ioc 實現原理

**概念** spring ioc其實就是一個容器(控制反轉) 其中放入了大量的bean和類 **spring ioc如何操作的** ioc對配置檔案進行掃面,掃面到bean標籤下面的包,將沒有的實現類new出來 **spring ioc四大核心註解** @Service @Controller @

adpcm編解碼原理及其程式碼實現

本文講解 0x0011 /* Intel’s DVI ADPCM */的編碼解碼原理。本文原創,轉發請標註littlezls原創。 1. 原始碼 adpcm.h #ifndef ADPCM_H #define ADPCM_H struct adpcm_sta

PPTP的工作原理以及作用

華科雲商是一家專業的動態IP解決方案服務商,現有派克斯、PPTP、HTTP代理、撥號VPS等產品。主要為註冊、搶購、遊戲,、打碼、爬蟲、網賺等需求IP資源的業務提供一站式產品服務。聯絡扣扣:56731523 PPTP(Point to Point Tunneling Pro