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。傳輸當前通道已有資料到另一通道。不經過使用者空間。