Java可变字节数组数据结构

7
我正在尝试找到一种简单的方法来创建一个可变的字节数组,可以自动追加任何基本的Java数据类型。我一直在搜索,但没有找到有用的信息。
我需要类似这样的东西。
ByteAppender byteStructure = new ByteAppender();
byteStructure.appendInt(5);
byteStructure.appendDouble(10.0);

byte[] bytes = byteStructure.toByteArray();

有一个很好的工具ByteByffer,但在使用前必须知道缓冲区的大小,这在我的情况下行不通。创建字符串有类似的工具(StringBuilder),但我找不到适用于字节的工具。

我认为这在Java中应该是显而易见的。


2
为什么不能使用 ArrayList<Byte>,然后再使用 .toArray() - Jeroen Vannevel
@JoshM,主要是速度问题。我有一个有序元素的集合,对于基本类型,我只需要使用它们的字节。但对于字符串,我需要计算它们的长度并将它们转换为字节数组。如果我必须先计算字节数组的大小,那么我就不得不两次迭代列表,在第一次迭代中计算大小,然后在第二次迭代中进行转换。 - Jason
@JeroenVannevel,ArrayList<Byte>不接受基本类型作为输入,所以我必须一直这样做:ByteBuffer.allocate(4).putInt(yourInt).array();,然后 for(Byte b : bytes) arrayBytes.add(b);。虽然可行,但非常混乱。 - Jason
1个回答

15

我猜你正在寻找java.io.DataOutputStream

ByteArrayOutputStream out = new ByteArrayOutputStream();
DataOutputStream dout = new DataOutputStream(out);
dout.writeInt(1234);
dout.writeLong(123L);
dout.writeFloat(1.2f);
byte[] storingData = out.toByteArray();

如何使用 storingData?

//how to use storingData?
ByteArrayInputStream in = new ByteArrayInputStream(storingData);
DataInputStream din = new DataInputStream(in);
int v1 = din.readInt();//1234
long v2 = din.readLong();//123L
float v3 = din.readFloat();//1.2f

完美。正是我所寻找的。 - Jason
请关闭 PS。 - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接