Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Jackson JsonParser跳过字节_Java_Jackson_Jackson Databind - Fatal编程技术网

Java 使用Jackson JsonParser跳过字节

Java 使用Jackson JsonParser跳过字节,java,jackson,jackson-databind,Java,Jackson,Jackson Databind,我目前有一个FileInputStream,我知道它包含json格式的交错对象(Metadata.class和BigInfo.class),顺序如下: [Metadata1,BigInfo1,Metadata2,BigInfo2,Metadata3,BigInfo3,…] 我使用Jackson的JsonParser来读取这些内容,比如parser.readValueAs(Metadata.class)和parser.readValueAs(BigInfo.class) 我想利用的一点是,元数据对

我目前有一个FileInputStream,我知道它包含json格式的交错对象(Metadata.class和BigInfo.class),顺序如下:

[Metadata1,BigInfo1,Metadata2,BigInfo2,Metadata3,BigInfo3,…]

我使用Jackson的JsonParser来读取这些内容,比如parser.readValueAs(Metadata.class)和parser.readValueAs(BigInfo.class)

我想利用的一点是,元数据对象包含以下序列化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的“跳过”方法慢得多,后者使用随机访问“查找”文件中的某个位置

我尝试在解析器的底层inputStream上调用“skip(bigInfoSize)”。但是,这不起作用,因为JsonParser从inputStream读取信息并将其存储在内部缓冲区中,因此inputStream的位置比解析器所在的位置更远

任何关于如何处理这一问题的想法都将不胜感激。
谢谢

因此,在环顾四周相当长一段时间之后,我不认为有一种干净的方法可以使用jsonParser实现这一点。
我最终实现了一个通用InputStream的读取器,该读取器查找“{”和“}”(当然要考虑嵌套对象),并通过ObjectMapper从检索到的字节数组中解析出底层对象。

您可能可以这样做

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);
RandomAccessFile文件=新的RandomAccessFile(文件名,“r”);
InputStream InputStream=Channels.newInputStream(file.getChannel());
seek(byteLocationToSkipTo)//这允许您设置指向此位置的文件指针
JsonParser parser=新的JsonFactory().createParser(inputStream);
Map=parser.readValueAs(Metadata.class);