【问题标题】:Using Dynamic Buffers? Java使用动态缓冲区?爪哇
【发布时间】:2011-03-01 17:39:33
【问题描述】:

在Java中,我有一个方法

public int getNextFrame( byte[] buff )

从文件读取到缓冲区并返回读取的字节数。我正在读取具有 5 字节值的 .MJPEG,例如“07939”,然后是 jpeg 的那么多字节。

问题在于 JPEG 字节大小可能会溢出缓冲区。我似乎无法为分配找到一个简洁的解决方案。我的目标是不为每个图像创建一个新缓冲区。我尝试了直接的ByteBuffer,所以我可以使用它的array() 方法来直接访问底层缓冲区。 ByteBuffer 不会动态扩展。

我应该返回对参数的引用吗?喜欢:

public ByteBuffer getNextFrame( ByteBuffer ref )

如何找到读取的字节?谢谢。

【问题讨论】:

    标签: java dynamic buffering


    【解决方案1】:

    java.io.ByteArrayOutputStream 是一个字节数组的包装器,并根据需要扩大它。也许这是你可以使用的东西。

    编辑:
    要重复使用,只需致电 reset() 并重新开始...

    【讨论】:

    • 诀窍在于使其可重用。 ;) 但是您可以创建自己的可重复使用的。
    • 你可以重用ByteArrayOutputStream,只需调用reset()...
    • ... 但是 toByteArray() 仍然会获取结果的副本,这可能是不受欢迎的。
    • 您可以扩展 ByteArrayOutputStream 直接获取缓冲区,它是类的定义部分,只是受保护。您必须在其上同步自己(如果需要)并记住这是完整的数组,包括尚未写入的字节。但如果内存使用/性能很重要,这是可以处理的。使用其他方法也会受到类似限制。
    • 好的。所以 java.io.ByteArrayOutputStream 动态增加;然后为了避免使用复制缓冲区的 toByteArray(),我需要扩展类。感谢您的输入!比我预期的要多得多(我是新来的)——令人印象深刻。
    【解决方案2】:

    只需读取所需的字节数。不要使用read(buffer),而是使用read(buffer,0,size)。如果还有更多的字节,就丢弃它们,无论如何JPG都坏了。

    【讨论】:

      【解决方案3】:

      编辑:

      分配一个字节[]比从一个文件或一个 插座,我会很惊讶它会产生很大的不同,除非你 拥有一个微秒成本的系统。

      读取一个 64 KB 的文件大约需要 10 毫秒(除非 文件在内存中)

      分配一个 64 KB byte[] 所需的时间约为 0.001 ms, 可能更快。


      您可以使用 apache IO 的 IOBuffer,但是这会非常昂贵。

      您也可以使用 ByteBuffer,position() 会告诉您读取了多少数据。

      如果您不知道缓冲区有多大,并且您有一个 64 位 JVM,您可以创建一个大的直接缓冲区。这只会在使用时分配内存(按页面)。结果是您可以分配 1 GB,但如果这就是您所需要的,则可能只使用 4 KB。直接缓冲区不支持array(),但是您必须使用其他方法从 ByteBuffer 中读取。

      另一种解决方案是使用AtomicReference<byte[]>,调用的方法可以根据需要增加大小,但如果它足够大,它会重用之前的缓冲区。

      【讨论】:

        【解决方案4】:

        在高级 API 中完成此操作的常用方法是让用户提供 OutputStream 并用您的数据填充它(可以是 ByteArrayOutputStream 或完全不同的东西),或者使用 InputStream 作为返回值,用户可以读取以获取数据(这将从文件中动态加载正确的部分并在完成后停止)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          • 2020-08-03
          • 2012-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多