我知道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);
但是,直接在解析器上调用解析不会返回一个读取器,我唯一的选择(在文档中注意到)是返回一个完全解析的字符串,这可能不适合内存使用。我知道我可以限制返回的字符串,但我想远离那个,因为我想要完全解析的信息,但是以增量方式。两全其美,这有可能吗?
答案 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并直接调用它以获得完全控制权!