有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何扩展字节缓冲区的分配内存

我有一个bytebuffer,我把Ints,Chars等放进去。。 因为我不知道我需要多少空间,我想动态地增长字节缓冲区。如何做到这一点

例如: -我有一个2字节的字节缓冲区 -我向字节缓冲区添加了一个字符(字节缓冲区现在已满) -我喜欢通过将字节缓冲区扩展为4字节,向字节缓冲区添加一个整数。我无法在开始时为字节缓冲区分配6个字节

    ByteBuffer byteBuffer = ByteBuffer.allocate(2);

    byteBuffer.putChar('a');
    byteBuffer.putInt(1);

我印象深刻的是,有多少人在研究我几分钟前提出的问题。非常感谢大家,也感谢Stackoverflow,这是一个很棒的平台

你们都问,我在做什么。所以我试着在这里解释一下。 我的用例: 我将结构化数据表示为javaobjects(javaclasses),我希望存储这些数据并从数据库中读取。阅读应该非常快。 到目前为止我所做的:

  • java序列化和反序列化并将其存储在blob中->;效果很好,但太慢了

  • 尝试了几个第三方序列化程序,比如kryo(这很好),但在我的应用程序中不可用 案例(安卓)

我的新策略:-): 我自己把我的班级具体化。为此,我想将我的类的整个数据按顺序构建为字节数组。这可能很慢。然后我将字节数组存储到数据库中的一个blob中。阅读时,我想立即阅读字节数组(字节数组大约为10k)。(我会有很多)。然后解析字节数组以提取结构化数据

我认为使用字节缓冲是实现这一点的理想选择,因为有putX和readX这样的方法?(X代表字符、浮点、整数)


共 (3) 个答案

  1. # 1 楼答案

    你不能,这是故意的。您可以分配一个新的字节缓冲区,并将溢出的数据写入该缓冲区。您可以将字节缓冲区保存在LinkedList中(它会根据需要增长),如果内存不足,甚至可以将旧字节缓冲区转储到磁盘,以分配新字节缓冲区。如果每个字节缓冲区的大小都相同,那么简单的等式将允许您访问它,就好像它只包含一个缓冲区一样,但您将失去使用切片或压缩的能力,或者您可以使用其中一个来执行的任何酷的操作。:)

    但就像人们反复说的,这取决于你需要它做什么

  2. # 2 楼答案

    我为我的用例找到了一个解决方案,我想在这里简短地描述一下。 我接受了米克尔的答案,因为关于这个问题,我想这是正确的答案,约翰也回答了这个问题。还要感谢彼得给我的精彩讲解

    我使用DataInputStream,这对我的情况很方便。 我使用DataInputStream和putInt、PutBoolean、PutString等方便的方法基于我的Javaobject创建了一个数据流。然后我得到DataInputStream的二进制数组,并将其作为blob存储到我的数据库中

    阅读与DataInputStream恰恰相反

    与javaobjects的javadeserialization相比,通过这种方式,我读取对象的性能提高了500%,存储使用量减少了25%

  3. # 3 楼答案

    如果将缓冲区实例保持在变量中,则可以。 比如这样(科特林):

    fun ShortBuffer?.clone(addLimit: Int = 0): ShortBuffer? {
        if (this == null) {
            return ShortBuffer.allocate(addLimit)
        } else {
            val copy = ShortBuffer.allocate(this.limit() + addLimit)
            copy.put(this.array())
            return copy
        }
    }
    
    fun ShortBuffer?.safePut(shortArray: ShortArray?): ShortBuffer? {
        if (this == null) {
            if(shortArray == null) {
                return null
            } else {
                val ret = ShortBuffer.allocate(shortArray.size)
                ret.put(shortArray)
                return ret
            }
        } else if (shortArray == null) {
            return this
        } else if (this.remaining() < shortArray.size) {
            val ret = clone(shortArray.size-this.remaining())
            ret?.put(shortArray)
            return ret
        } else {
            this.put(shortArray)
            return this
        }
    }
    

    用法:

    var buff = ShortBuffer.allocate(0)
    buff = buff.safePut(shortArrayOf(1,2,3))