有兩種方法從緩沖區(qū)讀取數(shù)據(jù):
使用四個版本重載的get()方法用于從緩沖區(qū)讀取數(shù)據(jù)。
get(int index)返回給定索引處的數(shù)據(jù)。
get()從緩沖區(qū)中的當前位置返回數(shù)據(jù),并將位置增加1。
get(byte [] destination,int offset,int length)從緩沖區(qū)中批量讀取數(shù)據(jù)。 它從緩沖區(qū)的當前位置讀取長度字節(jié)數(shù),并將它們放在從指定偏移量開始的指定目標數(shù)組中。
get(byte [] destination)通過從緩沖區(qū)的當前位置讀取數(shù)據(jù)并且每次讀取數(shù)據(jù)元素時將當前位置遞增1來填充指定的目標數(shù)組。
使用重載五個版本的put()方法將數(shù)據(jù)寫入緩沖區(qū)。
put(int index,byte b)將指定的b數(shù)據(jù)寫入指定的索引。 調(diào)用此方法不會更改緩沖區(qū)的當前位置。
put(byte b)將指定的字節(jié)寫入緩沖區(qū)的當前位置,并將位置遞增1。
put(byte [] source,int offset,int length)將起始于偏移量的源數(shù)組的字節(jié)長度寫入從當前位置開始的緩沖區(qū)。 如果緩沖區(qū)中沒有足夠的空間來寫入所有字節(jié),它會拋出BufferOverflowException。 緩沖區(qū)的位置按長度增加。
put(byte [] source)與調(diào)用put(byte [] source,0,source.length)相同。
ByteBuffer put(ByteBuffer src)從指定的字節(jié)緩沖區(qū)src讀取剩余的字節(jié),并將它們寫入緩沖區(qū)。 如果目標緩沖區(qū)中的剩余空間小于源緩沖區(qū)中的剩余字節(jié),則拋出運行時BufferOverflowException。
以下代碼顯示如何寫入緩沖區(qū)和從緩沖區(qū)讀取。
import java.nio.ByteBuffer; public class Main { public static void main(String[] args) { ByteBuffer bb = ByteBuffer.allocate(8); printBufferInfo(bb); for (int i = 50; i < 58; i++) { bb.put((byte) i); } printBufferInfo(bb); } public static void printBufferInfo(ByteBuffer bb) { int limit = bb.limit(); System.out.println("Position = " + bb.position() + ", Limit = " + limit); for (int i = 0; i < limit; i++) { System.out.print(bb.get(i) + " "); } System.out.println(); } }
如果我們可以在緩沖區(qū)上使用相對get()或put()方法來讀/寫至少一個元素,則緩沖區(qū)的hasRemaining()方法返回true。
我們可以通過使用相對的get()或put()方法,通過使用其remaining()方法來獲得我們可以讀/寫的最大數(shù)量的元素。
上面的代碼生成以下結(jié)果。
以下代碼顯示如何使用相對讀取和寫入之間的緩沖區(qū)的flip()和hasRemaining()方法。
import java.nio.ByteBuffer; public class Main { public static void main(String[] args) { ByteBuffer bb = ByteBuffer.allocate(8); printBufferInfo(bb); // Use flip() to reset the position to zero because // the printBufferInfo() method uses relative get() method bb.flip(); int i = 50; while (bb.hasRemaining()) { bb.put((byte) i++); } // Call flip() again to reset the position to zero, // because the above put() call incremented the position bb.flip(); printBufferInfo(bb); } public static void printBufferInfo(ByteBuffer bb) { int limit = bb.limit(); System.out.println("Position = " + bb.position() + ", Limit = " + limit); while (bb.hasRemaining()) { System.out.print(bb.get() + " "); } System.out.println(); } }
上面的代碼生成以下結(jié)果。
緩沖區(qū)可以是只讀的或讀寫的。 我們只能讀取只讀緩沖區(qū)的內(nèi)容。
我們可以通過調(diào)用特定緩沖區(qū)類的asReadOnlyBuffer()方法來獲取只讀緩沖區(qū)。
// Create a buffer that is read-write by default ByteBuffer bb = ByteBuffer.allocate(1024); boolean readOnly = bb.isReadOnly(); // false
要檢查緩沖區(qū)是否為只讀,請按如下所示調(diào)用isReadOnly()方法:
ByteBuffer bbReadOnly = bb.asReadOnlyBuffer(); boolean readOnly = bbReadOnly.isReadOnly();
asReadOnlyBuffer()方法返回的只讀緩沖區(qū)是同一個緩沖區(qū)的不同視圖。 對原始緩沖區(qū)的內(nèi)容的任何修改都反映在只讀緩沖區(qū)中。
我們可以獲得緩沖區(qū)的不同視圖。 緩沖區(qū)的視圖與原始緩沖區(qū)共享數(shù)據(jù),并保持其自身的位置,標記和限制。
我們也可以復制一個緩沖區(qū),在這種情況下,它們共享內(nèi)容,但獨立地保持標記,位置和限制。 使用緩沖區(qū)的duplicate()方法獲取緩沖區(qū)的副本如下:
// Create a buffer ByteBuffer bb = ByteBuffer.allocate(1024); // Create a duplicate view of the buffer ByteBuffer bbDuplicate = bb.duplicate();
我們還可以通過使用緩沖區(qū)的slice()方法創(chuàng)建其切片視圖,從而創(chuàng)建緩沖區(qū)的切片視圖,如下所示:
// Create a buffer ByteBuffer bb = ByteBuffer.allocate(8); bb.position(3); bb.limit(6); // bbSlice will have position set to 0 and its limit set to 3. ByteBuffer bbSlice = bb.slice();
我們還可以獲得用于不同原始數(shù)據(jù)類型的字節(jié)緩沖區(qū)的視圖。
例如,我們可以獲得字節(jié)緩沖區(qū)的字符視圖,浮點視圖等。ByteBuffer類包含諸如asCharBuffer(),asLongBuffer(),asFloatBuffer()等方法來獲得原始數(shù)據(jù)類型的視圖。
// Create a byte buffer ByteBuffer bb = ByteBuffer.allocate(8); // Create a char view of the byte buffer CharBuffer cb = bb.asCharBuffer(); // Create a float view of the byte buffer FloatBuffer fb = bb.asFloatBuffer();
更多建議: