【问题标题】:most efficient way to get byte[] to Queue (ListBlockingQueue)将字节 [] 放入队列 (ListBlockingQueue) 的最有效方法
【发布时间】:2012-11-08 17:10:29
【问题描述】:

我正在读取传递给我的字节数组(不是我的选择,但我必须以这种方式使用它)。我需要将数据获取到 LinkedBlockingQueue,并最终通过字节构建一个或多个(可能包含部分消息)xml 消息。所以我的问题是:

我应该为 LBQ 类型使用什么泛型? 将 byte[] 转换为该泛型类型的最有效方法是什么?

这是我的示例代码:

parsebytes(byte[] bytes, int length)
{
    //assume that i am doing other checks on data

    if (length > 0)
    {
        myThread.putBytes(bytes, length);
    }
}

在我的帖子中:

putBytes(byte[] bytes, int length)
{
    for (int i = 0; i < length; i++)
    { 
        blockingQueue.put(bytes[i]);
    }
}

我也不想一个字节一个字节地退出阻塞队列。我宁愿抓取队列中的所有内容并进行处理。

【问题讨论】:

  • 使用 Byte 类型并让 java 为您自动转换是否存在问题(不确定性能效率,但这可能是最简单的代码行)。
  • 您有byte[]ByteArrayInputStream 之类的吗?当您获得更多数据时,给您byte[] 的东西是否会继续更新它?如果这些问题的答案是否定的,为什么需要队列阻塞?
  • 函数参数为byte[]。基本上我需要尽快退出该功能,因此我将数据拉出并使用 LBQ 上的 put/take 在另一个线程中处理它。我目前将 LBQ 作为一个字节,但是必须循环输入一个字节一个字节似乎很浪费。

标签: java queue bytearray


【解决方案1】:

考虑一下:

    BlockingQueue<byte[]> q = new LinkedBlockingQueue<>();
    q.put(new byte[] {1,2,3});
    byte[] bytes = q.take();

【讨论】:

  • 如果我们将不同大小的 byte[] 放入队列中,q.take() 会返回多少字节?
  • @SohailAziz - 使用bytes.length 检查q.take() 返回的byte[] 中有多少字节。 BlockingQueue 将返回您放入其中的相同对象(在本例中为 byte[] 对象)。您可以通过查询数组的length 字段(即bytes.length)来检查字节数组中的字节数,
【解决方案2】:

没有ListBlockingQueue 这样的东西。但是,任何BlockingQueue&lt;Object&gt; 都将接受byte[],因为Java 数组是对象。

在没有其他设计考虑的情况下,最简单的选择可能是在数组到达时将它们放入队列中,然后让消费者将它们拼接在一起。

【讨论】:

  • 抱歉,打错了。它是一个 LinkedBlockingQueue。
  • 这是问题的一部分。对于定义: LinkedBlockingQueue blockingQueue = new LinkedBlockingQueue();你不能这样做:blockingQueue.put(bytes); //其中字节==字节[]
  • 你能把队列改成LinkedBlockingQueue&lt;Object&gt;吗?如果这样做,您将能够将数组直接放入队列中。
  • 这允许我编译。我还需要一段时间才能将它送到实验室并得到结果,但我充满希望。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多