Avro указывает двоичный формат для сериализации одного объекта, но также и файл контейнера объектов (также известный как файл данных), который может содержать множество объектов полезным способом для доступа к файлу.
DataFileStream
ожидает файл контейнера, но из вашего описания похоже, что у вас есть один сериализованный экземпляр.
Возможно, вы хотите что-то вроде:
public String avroToJson(Schema schema, byte[] avroBinary) throws IOException {
// byte to datum
DatumReader<Object> datumReader = new GenericDatumReader<>(schema);
Decoder decoder = DecoderFactory.get().binaryDecoder(avroBinary, null);
Object avroDatum = datumReader.read(null, decoder);
// datum to json
String json = null;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
DatumWriter<Object> writer = new GenericDatumWriter<>(schema);
JsonEncoder encoder = EncoderFactory.get().jsonEncoder(schema, baos, false);
writer.write(avroDatum, encoder);
encoder.flush();
baos.flush();
return new String(baos.toByteArray(), StandardCharsets.UTF_8);
}
}
Обратите внимание, что это означает, что вы должны знать схему заранее, чтобы десериализовать двоичные данные. Если бы это было файлом данных Avro, вы могли бы получить схему из метаданных файла.