0

我有一个 ByteArray 值为avroBinaryValue, Schema Name 值为 String schemaName, Last Modified Date 值为lastModifiedDatelong 。

byte[] avroBinaryValue = os.toByteArray();
String schemaName = "DEMOGRAPHIC";
long lastModifiedDate = "1379811105109";

现在我也打算转换schemaNamebyteArray。让我们命名它byteSchmeName

在那之后,我也将转换lastModifiedDatebyteArray。让我们把它命名为byteLMD

  1. 现在将这三个连接byteArrays在一起的最佳方法是什么。

    avroBinaryValue + byteSchemaName + byteLMD

  2. 其次,在将这三个字节数组连接在一起之后,我想以byteArrays这样一种方式拆分结果,以便我能够正确地获得所有三个相应的字节数组......

有可能这样做吗?任何帮助将不胜感激。

笔记:-

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

4

1 回答 1

1

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

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

还要决定是否需要大端或小端字节顺序。

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


这是一个在内存中完成的示例,其中osa String(为简单起见)

public static void main(String[] args) throws Exception {
    String os = "whatever os is";
    byte[] avroBinaryValue = os.getBytes();
    String schemaName = "DEMOGRAPHIC";
    long lastModifiedDate = 1379811105109L;

    byte[] schemaNameBytes = schemaName.getBytes();

    ByteArrayOutputStream byteOs = new ByteArrayOutputStream();
    DataOutputStream out = new DataOutputStream(byteOs);
    out.writeInt(avroBinaryValue.length);
    out.write(avroBinaryValue);
    out.writeInt(schemaNameBytes.length);
    out.write(schemaNameBytes);
    out.writeLong(lastModifiedDate);

    // write done

    byte[] allWrittenBytes = byteOs.toByteArray();

    DataInputStream in = new DataInputStream(new ByteArrayInputStream(allWrittenBytes));

    int sizeAvro = in.readInt();
    avroBinaryValue = new byte[sizeAvro];
    in.read(avroBinaryValue, 0, sizeAvro);

    int sizeSchema = in.readInt();
    schemaNameBytes = new byte[sizeSchema];
    in.read(schemaNameBytes, 0, sizeSchema);

    lastModifiedDate = in.readLong();

    // read done

    System.out.println(new String(avroBinaryValue));
    System.out.println(new String(schemaNameBytes));
    System.out.println(lastModifiedDate);
}

它打印

whatever os is
DEMOGRAPHIC
1379811105109

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

于 2013-09-26T03:44:16.447 回答