gpt4 book ai didi

java - Java 中的字节缓冲区队列

转载 作者:行者123 更新时间:2023-12-01 12:13:40 24 4
gpt4 key购买 nike

我想将 ByteBuffer 添加到 java 中的队列中,因此我有以下代码,

public class foo{

private Queue <ByteBuffer> messageQueue = new LinkedList<ByteBuffer>();

protected boolean queueInit(ByteBuffer bbuf)
{
if(bbuf.capacity() > 10000)
{
int limit = bbuf.limit();
bbuf.position(0);
for(int i = 0;i<limit;i=i+10000)
{
int kb = 1024;
for(int j = 0;j<kb;j++)
{
ByteBuffer temp = ByteBuffer.allocate(kb);
temp.array()[j] = bbuf.get(j);
System.out.println(temp.get(j));
addQueue(temp);
}
}
}
System.out.println(messageQueue.peek().get(1));
return true;
}

private void addQueue(ByteBuffer bbuf)
{
messageQueue.add(bbuf);
}
}

temp 值设置为正确的值时,for 循环的内部工作似乎正常工作,然后应通过调用 addQueue 将其添加到队列中> 方法。但是,只有字节缓冲区的第一个字母才会添加到队列中,而不会添加其他任何内容。因为当我查看队列head中的第一个值时,我得到了数字116,这是我应该得到的,但是当我尝试获取头部的其他值是0,这是不正确的。为什么会发生这种情况,除了 bytbuffer 的第一个值之外没有其他值被添加到队列的头部?

最佳答案

ByteBuffer.allocate 创建一个新的 ByteBuffer。在内部 j 循环的每次迭代中,您都会创建一个新缓冲区,在其中放置一个字节,并将该缓冲区传递给 addQueue。您执行此操作 1024 次(在外循环的每次迭代中),因此您创建了 1024 个具有单个字节集的缓冲区;在每个缓冲区中,所有其他字节都将为零。

您根本没有使用外循环的 i 循环变量。如果您的缓冲区大小只有 1024 字节,我不确定为什么您要跳过 10000 字节以上。

slice方法可用于从较大的 ByteBuffer 创建较小的 ByteBuffer:

int kb = 1024;
while (bbuf.remaining() >= kb) {

ByteBuffer temp = bbuf.slice();
temp.limit(1024);
addQueue(temp);

bbuf.position(bbuf.position() + kb);
}

if (bbuf.hasRemaining()) {
ByteBuffer temp = bbuf.slice();
addQueue(temp);
}

请务必记住,新的 ByteBuffer 将与 bbuf 共享内容。这意味着,对 bbuf 中的任何字节进行更改也会更改切片缓冲区之一。这可能就是您想要的,因为它比制作缓冲区副本更有效。 (如果您的原始缓冲区很大,效率可能会更高;您真的希望内存中存在 1 GB 缓冲区的两个副本吗?)

如果您确实需要将所有字节复制到独立的缓冲区中,无论产生的内存使用情况如何,您都可以让您的 addQueue 方法复制每个缓冲区空间:

private void addQueue(ByteBuffer bbuf)
{
bbuf = ByteBuffer.allocate(bbuf.remaining()).put(bbuf); // copy
bbuf.flip();
messageQueue.add(bbuf);
}

关于java - Java 中的字节缓冲区队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27129221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com