Java 增量读取期间的Tika传递解析器信息

Java 增量读取期间的Tika传递解析器信息,java,parsing,apache-tika,Java,Parsing,Apache Tika,我知道Tika有一个非常好的包装器,让我从解析文件中得到一个读取器,如下所示: Reader parsedReader = tika.parse(in); 但是,如果我使用它,我不能指定我想要的解析器和我想要传递的元数据。例如,我想传入额外的信息,比如要使用哪个处理程序、解析器和上下文,但如果使用此方法,我就不能这样做。据我所知,这是唯一一个让我获取一个Reader实例并以增量方式读取而不是获取整个解析字符串的方法 我希望包括的内容示例: Parser parser = new

我知道Tika有一个非常好的包装器,让我从解析文件中得到一个读取器,如下所示:

Reader parsedReader = tika.parse(in);
但是,如果我使用它,我不能指定我想要的解析器和我想要传递的元数据。例如,我想传入额外的信息,比如要使用哪个处理程序、解析器和上下文,但如果使用此方法,我就不能这样做。据我所知,这是唯一一个让我获取一个Reader实例并以增量方式读取而不是获取整个解析字符串的方法

我希望包括的内容示例:

        Parser parser = new AutoDetectParser();
        BodyContentHandler handler = new BodyContentHandler(-1);
        Metadata metadata = new Metadata();
        metadata.set(Metadata.RESOURCE_NAME_KEY, fileName); //This aids in the content detection
        ParseContext context = new ParseContext();
        context.set(Parser.class, parser);
        parser.parse(is, handler, metadata, context);

但是,直接在解析器上调用parse并不会返回读取器,我唯一的选择(在文档中注意到)是返回一个完全解析的字符串,这对于内存使用可能不是很好。我知道我可以限制返回的字符串,但我想远离它,因为我想使用完全解析的信息,但以增量方式。这是可能的吗?

它的许多优点之一是它是开源的,所以您可以看到它是如何工作的。您正在使用的类是

你感兴趣的课程的关键部分是:

public Reader parse(InputStream stream, Metadata metadata)
        throws IOException {
    ParseContext context = new ParseContext();
    context.set(Parser.class, parser);
    return new ParsingReader(parser, stream, metadata, context);
}
您可以看到Tika是如何获取解析器和流,并将其处理给读取器的。做一些类似的事情,你就准备好了。或者,编写自己的ContentHandler并直接调用它以获得完全控制