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

时间:2013-04-29 16:48:30

标签: java parsing apache-tika

我知道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);

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

1 个答案:

答案 0 :(得分:1)

Apache Tika的众多优点之一是它是开源的,所以你可以看到它是如何工作的。您使用的Tika facade的课程为here

该课程的关键部分是您的兴趣所在:

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如何使用解析器和流,并将其处理为Reader。做类似的事情,你已经设定好了。或者,编写您自己的ContentHandler并直接调用它以获得完全控制权!