是否有更好的方法从InputStream中获取Avro记录列表?

时间:2018-10-23 21:53:45

标签: java avro bytearrayinputstream

我有一个window.open('../../page/page2','_blank');序列化为ByteArrayInputStream的序列,该序列是SpecificRecord的实现。我找不到Avro知道序列化列表的方法,因此我采用了一种怪异的方式来遍历List<TestAvroModel>


ByteArrayInputStream

//TestAvroModel is an implementation of SpecificRecord
List<TestAvroModel> models;
ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
for(TestAvroModel model: models) {
    DatumWriter<SpecificRecord> writer = new SpecificDatumWriter<>(model.getSchema());
    Encoder encoder = new EncoderFactory().binaryEncoder(byteArrayStream, null);

    writer.write(model, encoder);
    encoder.flush();
}

这种方法可以一次读取序列化的//This was pre-serialized with a List of TestAvroModel ByteArrayInputStream inputStream; DatumReader<TestAvroModel> reader = new SpecificDatumReader<>(TestAvroModel.getClassSchema()); Decoder decoder = DecoderFactory().get().binaryDecoder(inputStream, null); List<TestAvroModel> records = new ArrayList<>(); boolean eof = false; while(!eof) { try { records.add(reader.read(null, decoder)); catch(EOFException ex) { eof = true; } } ,并将其添加到我的记录列表中。尽管循环遍历List<TestAvroModel>直到DatumReader似乎不是最好的方法,但是我还没有找到更好的方法。

我在Avro库中找不到处理EOFException且其中包含多个Avro记录的任何内容。尽管它必须要在流中具有断点,才能使Avro像我上面那样读取单个记录。重申一下,有没有人比上面显示的方法更好地遍历InputStream

1 个答案:

答案 0 :(得分:0)

Decoder似乎为此定义了isEnd(): Boolean

如果当前BinaryDecoder在其源结尾处,则返回true 数据,并且在没有抛出EOFException或 其他IOException。

这应该有效:

...
while(!decoder.isEnd()) {
  records.add(reader.read(null, decoder));
}