Java 字节缓冲和字节数组

Java 字节缓冲和字节数组,java,byte,bytebuffer,Java,Byte,Bytebuffer,问题 我需要将两个整数和一个长度可变的字符串转换为字节 我所做的 我将每个数据类型转换为字节数组,然后将它们添加到字节缓冲区中。在这之后,我将把缓冲区复制到一个字节数组,如下所示 byte[] nameByteArray = cityName.getBytes(); byte[] xByteArray = ByteBuffer.allocate(4).putInt(x).array(); byte[] yByteArray = ByteBuffer.allocate(4).putInt(y).a

问题

我需要将两个整数和一个长度可变的字符串转换为字节

我所做的

我将每个数据类型转换为字节数组,然后将它们添加到字节缓冲区中。在这之后,我将把缓冲区复制到一个字节数组,如下所示

byte[] nameByteArray = cityName.getBytes();
byte[] xByteArray = ByteBuffer.allocate(4).putInt(x).array();
byte[] yByteArray = ByteBuffer.allocate(4).putInt(y).array();
ByteBuffer byteBuffer = ByteBuffer.allocate(nameByteArray.length + xByteArray.length + yByteArray.length);

现在这似乎有点多余。我当然可以将所有内容放入字节缓冲区,并将其转换为字节数组。然而,我不知道我的字符串长度是多少。那么在这种情况下,如何分配字节缓冲区呢?(要分配字节缓冲区,必须指定其容量)

因为不能直接将字符串放入字节缓冲区,所以必须首先将其转换为字节数组。如果它是字节数组形式,你就知道它的长度

因此,优化版本应如下所示:

byte[] nameByteArray = cityName.getBytes();
ByteBuffer byteBuffer = ByteBuffer.allocate(nameByteArray.length + 8);
byteBuffer.put(nameByteArray);
byteBuffer.putInt(x);
byteBuffer.putInt(y);

假设你想把所有东西都放在一个bytebuffer中,为什么你不能做下面的事情呢

ByteBuffer byteBuffer = ByteBuffer.allocate( cityName.getBytes().length+ 4+ 4);
byteBuffer.put(cityName.getBytes()).putInt(x).putInt(y);

除非限制字符串的最大长度,否则始终需要动态计算存储字符串所需的字节数。如果将字符串限制为最大长度,则可以提前计算存储任何字符串的最大字节数,并分配适当大小的ByteBuffer。虽然对于所给出的简单示例不需要,但您可能需要考虑存储字符串字节长度以及字符串。然后,当读回数据时,您知道字符串中有多少字节。

要将缓冲区转换为字节数组,我将执行
byte[]message=byteBuffer.array()?byteBuffer.array()不会提供您想要的内容,如果byteBuffer不受数组支持,甚至可能引发异常。相反,请尝试:
buffer.flip();byte[]bytes=新字节[buffer.remaining()];buffer.get(字节)
@Robert我还有一个关于ByteBuffer的问题。想知道你对此有什么想法吗?是的,我已经在我的项目中做了类似的事情。谢谢