NIO學習筆記四

2021-07-15 07:31:37 字數 1954 閱讀 4248

第一行使用bytebuffer的靜態方法allocate()來分配緩衝區,函式引數指定了緩衝區的大小。第三行是將現有的陣列轉成緩衝區,通過靜態方法wrap(),引數為現有的陣列。

bytebuffer buffer = bytebuffer.allocate(1024);

byte array = new byte[1024];

bytebuffer buffer = bytebuffer.wrap(array);

slice()方法根據現有的緩衝區建立乙個字緩衝區,建立的子緩衝區共享原來緩衝區的空間。

第一行建立乙個長度為10的緩衝區,第二行第三行通過position和limit來指定子緩衝區視窗的起始位置和結束位置,第四行呼叫slice()方法來建立子緩衝區。注意,在子緩衝區中對資料進行修改,會作用於原來的緩衝區上,因為它們共享乙個底層陣列。比如,我對子緩衝區中的資料多做加10操作,然後遍歷輸出原來緩衝區的內容,會看到分配給子緩衝區的那些元素上的資料,都加上了10,而其他的保持不變。

bytebuffer buffer = bytebuffer.allocate(10);

buffer.position(3);

buffer.limit(7);

bytebuffer slice = buffer.slice();

通過呼叫緩衝區的 asreadonlybuffer() 方法,將任何常規緩衝區轉換為唯讀緩衝區,這個方法返回乙個與原緩衝區完全相同的緩衝區(並與其共享資料),只不過它是唯讀的。不能將唯讀的緩衝區轉換為可寫的緩衝區。

bytebuffer buffer = bytebuffer.allocate(64);

bytebuffer readonlybuffer = buffer.asreadonlybuffer();

直接緩衝區是為了加快i/o速度,而以一種特殊的方法分配其記憶體的緩衝區。可使用bytebuffer的靜態函式allocatedirect()來生成直接緩衝區。

bytebuffer buffer = bytebuffer.allocatedirect(1024);

利用作業系統底層提供的訪問機制,將檔案的部分對映為記憶體的部分。儘管建立記憶體對映檔案相當簡單,但是向它寫入可能是危險的。僅只是改變陣列的單個元素這樣的簡單操作,就可能會直接修改磁碟上的檔案。修改資料與將資料儲存到磁碟是沒有分開的。可以使用filechannel.map()來建立記憶體對映。其中map的第乙個引數有三種可選型別,都是靜態的成員變數,第一種是private,表示專用(寫入時拷貝)對映模式,可讀可寫,但是修改的內容不會寫入檔案,只是buffer自身的改變;第二種是read_only,表示唯讀對映,只能對buffer進行讀取操作,否則會丟擲readonlybufferexception異常;第三種是read_write,表示讀取/寫入對映模式,對buffer的修改會寫入檔案。

fileoutputstream out = new fileoutputstream("d:\\test.txt");

filechannel channel = out.getchannel();

分散和聚集 i/o 是使用多個而不是單個緩衝區來儲存資料的讀寫方法。乙個分散的讀取是將資料讀取到乙個緩衝區陣列中,而不是讀到單個緩衝區。乙個聚集寫入時把資料寫入緩衝區陣列,而不是單個緩衝區。在分散讀取中,通道一次填充每個緩衝區,填滿乙個緩衝區後,它就開始填充下乙個。在聚集寫入中,會把資料依次寫入到緩衝區中。

long read(bytebuffer dsts);

long read(bytebuffer dsts, int offset, int length);

long write(bytebuffer srcs);

long write(bytebuffer srcs, int offset, int length);

NIO學習筆記(四)selector選擇器

1.監聽所有註冊在selector上的channel,只有當資料準備完成後,才會建立服務端執行緒,完成io操作 2.selector可以被所有繼承了selectablechannel類的channel註冊,但是只有filechannel例外,因為它沒有繼承這個抽象類。3.選擇器類管理著乙個被註冊的c...

NIO學習筆記二 Channels

這一章主要是對nio的channels進行說明。1 channels與io stream的區別。主要區別如下 2 channel 主要實現。主要實現類如下 3 channel 的簡單例子。以下是使用channel讀取檔案內容的簡單例子 public static void readfile stri...

NIO學習一 NIO簡介

最近在學習nio,根據學習總結了一下,如果有不對的地方,請大佬指出。nio,就是new io,從jdk 1.4開始引入的新的api,它跟io的作用相同。它與傳統的io相比,有如下特性 1 nio是面向緩衝區的,io是面向流的。2 io是阻塞的操作,如果乙個io的read或者write沒有得到資料的時...