首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何避免制作ByteBuffer的防御性拷贝?

如何避免制作ByteBuffer的防御性拷贝?
EN

Stack Overflow用户
提问于 2011-10-03 23:28:19
回答 4查看 3K关注 0票数 19

我有一个类,它接受ByteBuffer作为构造函数参数。有没有一种方法可以避免进行防御性拷贝,以确保缓冲区在超过该点后不会被修改?

ByteBuffer.isReadOnly()不能保证原来的所有者不会修改缓冲区。更糟糕的是,似乎没有一种方法可以将ByteBuffer子类化。有什么想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-17 23:06:46

这是我目前所能做的最好的事情:

代码语言:javascript
复制
/**
 * Helper functions for java.nio.Buffer.
 * <p/>
 * @author Gili Tzabari
 */
public final class Buffers
{
    /**
     * Returns a ByteBuffer that is identical but distinct from the original buffer.
     * <p/>
     * @param original the buffer to copy
     * @return an independent copy of original
     * @throws NullPointerException if original is null
     */
    public static ByteBuffer clone(ByteBuffer original)
    {
        Preconditions.checkNotNull(original, "original may not be null");

        ByteBuffer result = ByteBuffer.allocate(original.capacity());
        ByteBuffer source = original.duplicate();
        source.rewind();
        result.put(source);

        try
        {
            source.reset();
            result.position(source.position());
            result.mark();
        }
        catch (InvalidMarkException unused)
        {
            // Mark is unset, ignore.
        }
        result.position(original.position());
        result.limit(original.limit());
        return result;
    }

    /**
     * Returns an array representation of a buffer. The returned buffer may, or may not, be tied to
     * the underlying buffer's contents (so it should not be modified).
     * <p/>
     * @param buffer the buffer
     * @return the remaining bytes
     */
    public static byte[] toArray(ByteBuffer buffer)
    {
        if (buffer.hasArray() && !buffer.isReadOnly() && buffer.position() == 0
            && buffer.remaining() == buffer.limit())
        {
            return buffer.array();
        }
        ByteBuffer copy = buffer.duplicate();
        byte[] result = new byte[copy.remaining()];
        copy.get(result);
        return result;
    }

    /**
     * Prevent construction.
     */
    private Buffers()
    {
    }
}

我还向甲骨文提交了一个功能请求:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7130631

票数 2
EN

Stack Overflow用户

发布于 2011-10-03 23:33:04

正如您所说,唯一真正的方法是使用buf.asReadOnlyBuffer(),然后将其传递给构造函数。除此之外别无选择,尽管您可以将内容复制到一个新的ByteBuffer中,然后传递它。

票数 4
EN

Stack Overflow用户

发布于 2011-10-03 23:33:09

不会避免复制,但也许:

  1. 使用预分配的ByteBuffers
  2. 预填充池允许作者的类的构造函数允许传入ByteBuffer的“复制”,但让类使用池中的ByteBuffer将分配/取消分配成本移动到应用程序启动/关闭。只需以这种方式支付memcopy费用。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7637105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档