有兩種方法從緩沖區(qū)讀取數(shù)據(jù):
使用四個版本重載的get()
方法用于從緩沖區(qū)讀取數(shù)據(jù)。
get(int index)
返回給定索引處的數(shù)據(jù)。get()
從緩沖區(qū)中的當(dāng)前位置返回數(shù)據(jù),并將位置增加1
。get(byte [] destination,int offset,int length)
從緩沖區(qū)中批量讀取數(shù)據(jù)。 它從緩沖區(qū)的當(dāng)前位置讀取長度字節(jié)數(shù),并將它們放在從指定偏移量開始的指定目標(biāo)數(shù)組中。
get(byte [] destination)
通過從緩沖區(qū)的當(dāng)前位置讀取數(shù)據(jù)并且每次讀取數(shù)據(jù)元素時將當(dāng)前位置遞增1
來填充指定的目標(biāo)數(shù)組。
使用重載五個版本的put()
方法將數(shù)據(jù)寫入緩沖區(qū)。
put(int index,byte b)
將指定的b
數(shù)據(jù)寫入指定的索引。調(diào)用此方法不會更改緩沖區(qū)的當(dāng)前位置。put(byte b)
將指定的字節(jié)寫入緩沖區(qū)的當(dāng)前位置,并將位置遞增1
。
put(byte [] source,int offset,int length)
將起始于偏移量的源數(shù)組的字節(jié)長度寫入從當(dāng)前位置開始的緩沖區(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ū)。如果目標(biāo)緩沖區(qū)中的剩余空間小于源緩沖區(qū)中的剩余字節(jié),則拋出運(yùn)行時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é)果。
Position = 0, Limit = 8
0 0 0 0 0 0 0 0
Position = 8, Limit = 8
50 51 52 53 54 55 56 57
以下代碼顯示如何使用相對讀取和寫入緩沖區(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é)果。
Position = 0, Limit = 8
0 0 0 0 0 0 0 0
Position = 0, Limit = 8
50 51 52 53 54 55 56 57
緩沖區(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ù),并保持其自身的位置,標(biāo)記和限制。
也可以復(fù)制一個緩沖區(qū),在這種情況下,它們共享內(nèi)容,但獨立地保持標(biāo)記,位置和限制。 使用緩沖區(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();