在編寫網路應用的時候資料緩衝區是應該比較常用的方式,主要用構建乙個記憶體區用於儲存傳送的資料和接收的資料;為了更好的利用已有資料緩衝區所以構造乙個緩衝池來存放相關資料方便不同連線更好地利用緩衝區,節省不停的構造新的緩衝區所帶的損耗問題。
其實構造乙個緩衝區非常簡單,根據需分本相關大小的byte陣列即可;既然是用於存放資料那就自然要實現讀和寫方法,看一下具體實現
public class databuffer : idisposable為了方便使用,buffer實現了idisposable介面,其作為就是當釋放的時候把buffer放回到pool裡.public databuffer(int length)
public void from(array source, int index, int count)
public int write(byte data)
public int write(byte data, int index)
else
if (count > 0)
return count;
}public arraysegmentread(int count)
public void seek()
public void seek(int postion)
public arraysegmentgetsegment()
internal bufferpool pool
public void dispose()
}}
buffer提供了兩個方法分別是write和read用於寫和讀資料,由於緩衝區有大小限制,所以在寫的時候會返回乙個成功寫入的數量;而read則返回乙個arraysegment用於描述其位置。為什麼要這樣做呢,其實有些情況乙個資料成員會被寫入到不同的緩衝區,當讀出來的時候就會存要在多個緩衝區中獲取。
緩衝池用於發放和**級沖區,實現乙個重用的目的。池的實現並不複雜,封裝乙個簡單的佇列操作即可。
public class bufferpool : idisposablebufferpool實現了幾個靜態方法public static void setup(int pools, int buffers, int bufferlength)}}
public static void clean()
mpools.clear();}}
public static bufferpool getpool()
return mpools[mindex];}}
queuembuffers;
private int mbufferlength;
public bufferpool(int count, int bufferlength)
}private databuffer createbuffer(int length)
public databuffer pop()
}public void push(databuffer buffer)
}private bool mdisposed = false;
private void ondispose()}}
public void dispose()}}
}
setup
主要目的是用於構造多個緩衝池,緩衝區數量和緩衝區大小。為什麼會考慮多個池呢,主要原因是在高併發的來分配處理減低池的負載。
clean
用於清除釋放緩衝池
getpool
平均地分發緩衝池給使用者
乙個簡單的資料緩衝區和資料緩衝池已經實現了,在後面的文章裡會講述如何構造bufferwriter和bufferreader,根據物件的需要把資訊分別寫入多個緩衝區和在多個緩衝區中讀取資訊還原物件。
通道和緩衝區
通常來說nio中的所有io都是從channel開始的。channel和流有點類似。通過channel,我們即可以從channel把資料寫到buffer中,也可以把資料從buffer寫入到channel,下圖是乙個示意圖 通道可以理解成一種連線,根據連線物件的不同,可以分為下面這些型別 檔案連線 fi...
回環緩衝區實現
回環緩衝區就是迴圈佇列,可以通過陣列實現也可以通過鍊錶實現。基於陣列的回環緩衝區實現 1 有乙個head指標始終指向隊首元素,有乙個rear指標始終指向隊尾元素的下乙個單元。2 佇列容量時maxlen,最大元素長度時maxlen 1。3 head read時表示佇列空,rear 1 maxlen h...
Java NIO 入門學習 通道和緩衝區
對於 nio 來說,channel 通道 和 buffer 緩衝區 這兩個東西是不得不提的,因為它們是 nio 的核心物件,幾乎每乙個 i o 操作都要它們。通道是對原 i o 流的模擬,但有不同的是它是雙向的,不再像流那樣分 inputstream 和 outputstream,通道的雙向性更好的...