我目前有一个FileInputStream,我知道它包含json格式的交错对象(Metadata.class和BigInfo.class),排序如下:
[Metadata1,BigInfo1,Metadata2,BigInfo2,Metadata3,BigInfo3,...]
我使用Jackson的JsonParser来读取这些内容,如parser.readValueAs(Metadata.class)和parser.readValueAs(BigInfo.class)。
我想利用的一件事是Metadata对象包含以下序列化BigInfo对象的长度,以及我是否需要读取它。所以我希望能够跳过与BigInfo对象相对应的适当字节数,如果我不需要阅读它:
Metadata metadata = parser.readValueAs(Metadata.class);
// Whether I need to read the BigInfo object that comes after
boolean mustRead = metadata.isMustReadBigInfo();
if (!mustRead) {
// Size of the bigInfo object that comes after
int bigInfoSize = metadata.getBigInfoSize();
parser.skip(bigInfoSize); // This 'skip' method is needed
}
我可以实现"跳过"通过使用parser.skipChildren(),但这将按顺序读取(并丢弃)inputStream的所有字节,并且比基础FileInputStream' skip'方法,利用随机访问'寻找'进入档案中的一个位置。
我试过打电话'跳过(bigInfoSize)'在解析器的底层inputStream上。但是,由于JsonParser从inputStream读取并存储内部缓冲区中的信息,因此这不起作用,因此inputStream的位置比解析器所处的位置更远。
非常感谢任何有关如何处理此问题的想法。 谢谢!
答案 0 :(得分:0)
所以在浏览了一下之后,我认为用jsonParser做一些干净的方法。 我最终为一般的InputStream实现了一个阅读器,它寻找'{'和'}'(当然要考虑嵌套对象),并通过ObjectMapper从检索到的字节数组中解析出底层对象。
答案 1 :(得分:0)
您也许可以做这样的事情
RandomAccessFile file = new RandomAccessFile(filename, "r");
InputStream inputStream = Channels.newInputStream(file.getChannel());
file.seek(byteLocationToSkipTo); //This allows you to set file pointer to this location
JsonParser parser = new JsonFactory().createParser(inputStream);
Map<String, Object> map = parser.readValueAs(Metadata.class);