我的ByteArray值为avroBinaryValue
,Schema Name值为String schemaName
,Last Modified Date值为lastModifiedDate
。
byte[] avroBinaryValue = os.toByteArray();
String schemaName = "DEMOGRAPHIC";
long lastModifiedDate = "1379811105109";
现在我打算将schemaName
转换为byteArray
。我们将其命名为byteSchmeName
。
之后,我也会将lastModifiedDate
转换为byteArray
。我们也可以将其命名为byteLMD
。
现在将这三个byteArrays
连接在一起的最佳方法是什么。
avroBinaryValue + byteSchemaName + byteLMD
其次,在将这三个byteArrays连接在一起之后,我想以这样的方式拆分生成的byteArrays
,以便我能够正确地获取所有三个相应的byteArrays ...
有可能吗?任何帮助将不胜感激。
注意: -
所有三个byteArrays值在不同场景下都会有所不同。我正在寻找以这种方式存储生成的byteArrays的最有效方法,这样它就不会占用磁盘上那么多空间。我不想再次序列化它,因为我得到的avroBinaryValue来自Avro数据序列化。所以我想在ByteArray中转换其他两个东西,以便我可以将所有三个合并为一个ByteArray。
答案 0 :(得分: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
同时决定是否需要big-endian或小端字节顺序。
因此,您按照格式描述了三个字段,并以相同的方式阅读。
以下是在内存中完成的示例os
为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等标准格式来序列化字段可能更好。