[英]java.io.IOException: Not a data file while reading Avro from file
以下代碼用於序列化數據。
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
BinaryEncoder binaryEncoder =
EncoderFactory.get().binaryEncoder(byteArrayOutputStream, null);
DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>(data.getSchema());
datumWriter.setSchema(data.getSchema());
datumWriter.write(data, binaryEncoder);
binaryEncoder.flush();
byteArrayOutputStream.close();
result = byteArrayOutputStream.toByteArray();
我使用了以下命令
FileUtils.writeByteArrayToFile(new File("D:/sample.avro"), data);
將 avro 字節數組寫入文件。 但是當我嘗試閱讀相同的內容時
File file = new File("D:/sample.avro");
try {
dataFileReader = new DataFileReader(file, datumReader);
} catch (IOException exp) {
System.out.println(exp);
System.exit(1);
}
它拋出異常
java.io.IOException: Not a data file.
at org.apache.avro.file.DataFileStream.initialize(DataFileStream.java:105)
at org.apache.avro.file.DataFileReader.<init>(DataFileReader.java:97)
at org.apache.avro.file.DataFileReader.<init>(DataFileReader.java:89)
這里發生了什么問題。 我提到了另外兩個類似的stackoverflow問題this和this ,但對我沒有太大幫助。 有人可以幫我理解這一點。
實際數據以 Avro 二進制格式編碼,但通常傳遞的不僅僅是編碼數據。
大多數人對“avro 文件”的看法是一種包含 header(其中包含諸如 writer 架構之類的內容)和實際數據的格式: https://avro.ZB6EFD606D118D0F6#42066FE31/419.html0對象+容器+文件。 avro 文件的前四個字節應該是 b"Obj1" 或 0x4F626A01。 您收到的錯誤是因為您嘗試作為數據文件讀取的二進制文件不是以標准魔術字節開頭。
另一種標准格式是單一的 object 編碼: https://avro.apache.org/docs/current/spec.html#single_object_encoding 。 這種類型的二進制格式應該以 0xC301 開頭。
但如果我不得不猜測,您擁有的二進制文件可能只是沒有任何 header 信息的原始序列化數據。 盡管如果不知道您擁有的字節數組是如何創建的,則很難確定。
您需要使用 Avro 來寫入和讀取數據,否則不會寫入架構(因此會出現“不是數據文件”消息)。 (參見: https://cwiki.apache.org/confluence/display/AVRO/FAQ#FAQ-HowcanIserializedirectlyto/fromabytearray? )
如果您只是想序列化 object,請參閱: https://mkyong.com/java/how-to-read-and-write-java-object-to-a-file/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.