[英]transferring bytes from one ByteBuffer to another
將ByteBuffer bbuf_src
盡可能多的字節放入另一個ByteBuffer bbuf_dest
(以及知道傳輸了多少字節)的最有效方法是什么? 我正在嘗試使用bbuf_dest.put(bbuf_src)
但它似乎想拋出一個BufferOverflowException,當我需要它時,我現在無法從Sun獲取javadoc(網絡問題)。 > :(唉。
編輯:darnit,@ Richard的方法(使用來自bbuf_src
支持數組的put())如果bbuf_src是ReadOnly緩沖區將無效,因為您無法訪問該數組。 在那種情況下我該怎么辦?
正如您所發現的那樣,獲取后備陣列並不總是有效(對於只讀緩沖區,直接緩沖區和內存映射文件緩沖區,它會失敗)。 更好的選擇是復制源緩沖區並為要傳輸的數據量設置新的限制:
int maxTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
// use a duplicated buffer so we don't disrupt the limit of the original buffer
ByteBuffer bbuf_tmp = bbuf_src.duplicate ();
bbuf_tmp.limit (bbuf_tmp.position() + maxTransfer);
bbuf_dest.put (bbuf_tmp);
// now discard the data we've copied from the original source (optional)
bbuf_src.position(bbuf_src.position() + maxTransfer);
好的,我改編了@ Richard的回答:
public static int transferAsMuchAsPossible(
ByteBuffer bbuf_dest, ByteBuffer bbuf_src)
{
int nTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
if (nTransfer > 0)
{
bbuf_dest.put(bbuf_src.array(),
bbuf_src.arrayOffset()+bbuf_src.position(),
nTransfer);
bbuf_src.position(bbuf_src.position()+nTransfer);
}
return nTransfer;
}
並進行測試以確保其有效:
public static boolean transferTest()
{
ByteBuffer bb1 = ByteBuffer.allocate(256);
ByteBuffer bb2 = ByteBuffer.allocate(50);
for (int i = 0; i < 100; ++i)
{
bb1.put((byte)i);
}
bb1.flip();
bb1.position(5);
ByteBuffer bb1a = bb1.slice();
bb1a.position(2);
// bb3 includes the 5-100 range
bb2.put((byte)77);
// something to see this works when bb2 isn't empty
int n = transferAsMuchAsPossible(bb2, bb1a);
boolean itWorked = (n == 49);
if (bb1a.position() != 51)
itWorked = false;
if (bb2.position() != 50)
itWorked = false;
bb2.rewind();
if (bb2.get() != 77)
itWorked = false;
for (int i = 0; i < 49; ++i)
{
if (bb2.get() != i+7)
{
itWorked = false;
break;
}
}
return itWorked;
}
你得到BufferOverflowException,因為你的bbuf_dest不夠大。
您需要使用bbuf_dest.remaining()來查找可以從bbuf_src傳輸的最大字節數:
int maxTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
bbuf_dest.put(bbuf_src.array(), 0, maxTransfer);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.