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代表字符、浮点、整数)
# 1 楼答案
你不能,这是故意的。您可以分配一个新的字节缓冲区,并将溢出的数据写入该缓冲区。您可以将字节缓冲区保存在LinkedList中(它会根据需要增长),如果内存不足,甚至可以将旧字节缓冲区转储到磁盘,以分配新字节缓冲区。如果每个字节缓冲区的大小都相同,那么简单的等式将允许您访问它,就好像它只包含一个缓冲区一样,但您将失去使用切片或压缩的能力,或者您可以使用其中一个来执行的任何酷的操作。:)
但就像人们反复说的,这取决于你需要它做什么
# 2 楼答案
我为我的用例找到了一个解决方案,我想在这里简短地描述一下。 我接受了米克尔的答案,因为关于这个问题,我想这是正确的答案,约翰也回答了这个问题。还要感谢彼得给我的精彩讲解
我使用DataInputStream,这对我的情况很方便。 我使用DataInputStream和putInt、PutBoolean、PutString等方便的方法基于我的Javaobject创建了一个数据流。然后我得到DataInputStream的二进制数组,并将其作为blob存储到我的数据库中
阅读与DataInputStream恰恰相反
与javaobjects的javadeserialization相比,通过这种方式,我读取对象的性能提高了500%,存储使用量减少了25%
# 3 楼答案
如果将缓冲区实例保持在变量中,则可以。 比如这样(科特林):
用法: