1. 程式人生 > 其它 >Google Summer of Code谷歌程式設計之夏活動流程全解析(上)

Google Summer of Code谷歌程式設計之夏活動流程全解析(上)

位元組緩衝區

位元組順序-大端-小端

ByteOrder.nativeOrder().toString() 獲取當前處理器的位元組順序

直接緩衝區

ByteBuffer.allocateDirect() 建立所需容量的直接緩衝區

isDirect() 是否直接緩衝區

只有位元組型別資料才可以建立直接緩衝區,其他型別可使用檢視緩衝區

ByteBuffer.asCharBuffer() 根據位元組直接緩衝區建立一個字元直接緩衝區

檢視緩衝區

與源緩衝區操作地址一致,但position\limit 等標識可不一致。

byteBuffer.as***() 此類操作以位元組順序包裝為指定緩衝區

duplicate()

slice()

通道

通道是途徑,是抽象的概念,受控的且可移值的方式來訪問作業系統底層I/O

  • 檔案通道
  • Socket通道

阻塞、非阻塞

開啟通道

FileChannel.getChannle()

SocketSchannel.getChannel()

關閉通道

通道是無法重複使用的

中斷阻塞在通道上的執行緒會自動關閉通道

channel.close(); 在網路上可能是阻塞的(在內容被提取前,部分框架可能會阻塞通道關閉)

Scatter/Gather(發散/收集)

以Channel為視角,channel.writer(Buffer[] ) 。channel.read(Buffer[])

通道接收多個緩衝區,將多個緩衝區內容“Gather”到通道。

將通道內容“Scatter”到多個緩衝區。

這個過程是順序的。也是高效的(由作業系統直接完成)。

buffer--\         channel            / buffer
buffer----Scatter =======  Gather------buffer
buffer--/                            \ buffer

檔案通道

FileChannel

read()/write()方法會改變Position位置,同一檔案的多個物件是共享Position的(由作業系統控制)。

read(p)/write(p) 這個是不共享的。

將position位置移動到大於檔案size的位置,呼叫write()可能會照成 "檔案空洞"。

truncate() 會去除超出的size值,並將position = size

force(boolean) 類似刷盤的操作,強制將檔案內容寫入磁碟。引數標識是否將檔案元資料強制寫入。

檔案鎖

不支援共享鎖的作業系統自動升級到獨享鎖。

鎖的物件是檔案,而不是通道或者緩衝區。

鎖判斷的是程序而不是執行緒,意味著同一Java程序獲取到鎖後同一程序都能獲取到鎖。

FileChannel.lock(position,size, shared) 鎖定position-size位置,shared標識是否共享。

channel關閉、FileLock.release()、程序關閉會釋放鎖。

FileLock.isVaild() 校驗鎖是否有效。

避免死鎖。

記憶體對映檔案

MapperByteBuffer 將物理磁碟中的檔案直接在程式中操作。

load()

isLoaded()

force() 與FileChannel.force()一樣


transferto/transferForm 通道間檔案資料傳輸,有一端必須為FileChannel。傳輸當前通道已有資料到另一通道。不經過使用者空間。

Socket通道