Java 将三个ByteArray合并在一起,然后拆分生成的ByteArray

Java 将三个ByteArray合并在一起,然后拆分生成的ByteArray,java,split,bytearray,Java,Split,Bytearray,我的ByteArray值为avroBinaryValue,架构名称值为StringschemaName,最后修改的日期值为lastModifiedDate byte[] avroBinaryValue = os.toByteArray(); String schemaName = "DEMOGRAPHIC"; long lastModifiedDate = "1379811105109"; 现在我还计划将schemaName转换为byteArray。让我们把它命名为byteSchmeName

我的ByteArray值为
avroBinaryValue
,架构名称值为String
schemaName
,最后修改的日期值为
lastModifiedDate

byte[] avroBinaryValue = os.toByteArray();
String schemaName = "DEMOGRAPHIC";
long lastModifiedDate = "1379811105109";
现在我还计划将
schemaName
转换为
byteArray
。让我们把它命名为byteSchmeName

之后,我将把
lastModifiedDate
转换为
byteArray
。让我们将其命名为
byteLMD

  • 现在,将这三个
    字节数组连接在一起的最佳方法是什么

    avroBinaryValue+byteSchemaName+byteLMD

  • 其次,在将这三个ByteArray连接在一起之后,我想以这样一种方式拆分生成的
    ByteArray
    ,这样我就能够正确地获得所有三个相应的ByteArray

  • 有可能吗?任何帮助都将不胜感激

    注意:-


    在不同的场景中,所有三个ByteArray值都将不同。。我正在寻找最有效的方法来存储生成的ByteArray,这样就不会占用磁盘上太多空间。我不想再次序列化它,因为我得到的avroBinaryValue来自Avro数据序列化。。因此,我想在ByteArray中转换其他两个元素,以便将这三个元素合并为一个ByteArray。

    您需要定义一种格式。你有以下几点

    byte[] avroBinaryValue = os.toByteArray();
    String schemaName = "DEMOGRAPHIC";
    long lastModifiedDate = 1379811105109L;
    
    我猜
    avroBinaryValue
    可以是可变长度的,
    schemaName
    也可以是可变长度的。出于所有目的,
    lastModifiedDate
    可容纳8个字节

    如果要序列化此文件(而不是使用
    Serializable
    ),则必须使用特定的格式来告诉您正在阅读的内容以及何时停止阅读。比如说

    Offset  Length (in bytes)      Purpose
       0           4               - length of avroBinaryValue array
       4           X               - avroBinaryValue array
      4+X          4               - length of of schemaName byte array
     4+X+4         Y               - schemaName byte array
    4+X+4+Y        8               - value of lastModifiedDate
    
    还要确定您想要的是大端字节顺序还是小端字节顺序

    因此,您按照格式中的描述编写三个字段,并以相同的方式读取


    下面是一个在内存中完成的示例,
    os
    是一个
    字符串(为了简单起见)

    它打印

    whatever os is
    DEMOGRAPHIC
    1379811105109
    


    我知道您试图节省空间,但最好将每个字段写入自己的列,或者使用XML或JSON等标准格式来序列化字段。

    如果您试图将数据写入磁盘并再次读取,则可以使用DataOutputStream和DataInputStream(当然还有FileOutputStream和FileInputStream).我会写信给Cassandra数据库,所以这就是我对disk说的原因。.谢谢你的建议。是的,你是正确的,avroBinaryValue将是可变长度的,schemaName也可以是可变长度的。.但大多数时候,它也会是固定的,让我们假设所有schemaName的长度都是8.但是LMD将始终是一个长的,并且是应该是8字节…如果可能的话,你能在我上面的场景中提供一个例子,看看如何用Java实现它。这将帮助我理解这个过程。@TrekkieTechieT-T我已经发布了一个内存中的例子。谢谢你的帮助。。是的,我完全理解,最好使用JSON或将它作为一个单独的列来写。。但是我不能作为一个单独的列bcoz,我将使用Cassandra,每当我们存储数据时,每个列名都会重复,因此这将是一种浪费空间的行为……一般来说,我知道这是一个愚蠢的问题,但如果我使用JSON并将其序列化为JSON,那么哪种方法更好?我们现在正在使用的方法还是使用JSON?which在性能方面会更好?@trekkietchiet-T在大小方面,使用上述方法,您将编写更少的字节。但是,您必须编写所有这些逻辑来解析/生成字节。使用JSON,您可以使用许多可用库中的任何一个,Gson、jackson、Simple JSON等。我知道这是一篇非常古老的文章,但正在尝试了解本例中使用的是大端字节顺序还是小端字节顺序?以及如何知道我们遵循的是哪种顺序?
    whatever os is
    DEMOGRAPHIC
    1379811105109