Java 为什么在使用ForkParser时没有填充我的Tika元数据对象?

Java 为什么在使用ForkParser时没有填充我的Tika元数据对象?,java,memory-management,metadata,content-type,apache-tika,Java,Memory Management,Metadata,Content Type,Apache Tika,ForkParser是Tika版本0.9中引入的一种新的Tika解析器,位于org.apache.Tika.fork。新的解析器派生出一个新的jvm进程来分析传递的文件流。我认为这可能是一个很好的方法来限制我愿意为Tika的元数据提取过程投入多少内存。但是,Metadata对象没有像使用AutoDetectParser时那样填充适当的元数据属性。测试表明BodyContentHandler对象不是null 为什么元数据对象没有填充任何内容(手动添加的资源\u名称\u键除外) 不幸的是,Tika

ForkParser
是Tika版本0.9中引入的一种新的Tika解析器,位于
org.apache.Tika.fork
。新的解析器派生出一个新的jvm进程来分析传递的文件流。我认为这可能是一个很好的方法来限制我愿意为Tika的元数据提取过程投入多少内存。但是,
Metadata
对象没有像使用
AutoDetectParser
时那样填充适当的元数据属性。测试表明
BodyContentHandler
对象不是
null

为什么
元数据
对象没有填充任何内容(手动添加的
资源\u名称\u键
除外)

不幸的是,Tika 1.0中的类不支持元数据提取,因为到分叉解析器进程的通信通道目前只支持传回SAX事件,而不支持元数据条目。我建议你提出一个改进问题来解决这个问题


您可能想考虑的是从分叉解析器返回的XHTML文档的<代码> <代码>部分中获取从“代码> >代码>标签中提取的元数据。这些应该是可用的,并且包含大多数通常在对象中返回的元数据项。

谢谢Jukka,正如您所提到的,我提交了一个Tika改进问题。我将研究如何查询由parse方法生成的XHTML文档,我仍然需要弄清楚如何做到这一点。XHTML文档从哪里返回?我看到的是parse方法是一个void方法,不返回任何内容。它是在内容处理程序中还是在传递给解析方法的其他对象中?
public static Metadata getMetadata(File f) {
    Metadata metadata = new Metadata();
    try {
        FileInputStream fis = new FileInputStream(f);
        BodyContentHandler contentHandler = new BodyContentHandler(-1);
        ParseContext context = new ParseContext();
        ForkParser parser = new ForkParser();

        parser.setJavaCommand("/usr/local/java6/bin/java -Xmx64m");
        metadata.set(Metadata.RESOURCE_NAME_KEY, f.getName());

        parser.parse(fis, contentHandler, metadata, context);
        fis.close();

        String contentType = metadata.get(Metadata.CONTENT_TYPE);

        logger.error("contentHandler: " + contentHandler.toString());
        logger.error("metadata: " + metadata.toString());

        return metadata;

    } catch (Throwable e) {
        logger.error("Exception while analyzing file\n" +
        "CAUTION: metadata may still have useful content in it!\n" +
        "Exception: " + e, e);

        return metadata;
    }
}