Apache Tika 和文件访问而不是 Java 输入流

Posted

技术标签:

【中文标题】Apache Tika 和文件访问而不是 Java 输入流【英文标题】:Apache Tika and File access instead of Java Input Stream 【发布时间】:2011-08-27 14:27:25 【问题描述】:

我希望能够创建一个新的 Tika 解析器来从文件中提取元数据。我们已经在使用 Tika,元数据提取将始终如一地进行。

我认为我遇到了 Tika 的这个问题/增强请求:

Allow passing of files or memory buffers to parsers

我有一个控制台 c++ 可执行文件,它在输入时接受文件的路径,然后输出它找到的元数据,每行由名称/值对组成。 c++ 代码依赖于在访问数据时需要文件路径的库。 用 Java 重写这个可执行文件是不可能的。 我认为将其插入 Tika 会相当容易。但是 Tika 解析器需要在 Java 中,并且需要重写的 Tika 解析器方法需要一个开放的输入流:

void parse(InputStream 流、ContentHandler 处理程序、元数据元数据、ParseContext 上下文)

所以我想我唯一的解决方案是获取输入流并将其写入临时文件,然后处理写入的文件,然后最终清理文件。我讨厌弄乱临时文件,然后可能不得不担心临时文件的清理,如果出现问题并且它不会被删除。

有没有人知道如何干净利落地处理这样的事情?

【问题讨论】:

【参考方案1】:

TikaInputStream 应该会有所帮助。它处理包装文件或输入流,并根据解析器的需要在它们之间进行内部转换。它会根据您的需要执行所有临时文件位。

一些 Java 解析器已经使用它,因为它们需要一个文件而不是输入流。更重要的是,拥有文件的用户可以将其传递给以 InputStream 封装的 Parser,而 Parser 可以根据需要将其读取为 File 或 InputStream。

所以,我建议您将 InputStream 转换为 TikaInputStream(如果它已经是一个,则只是一个转换),然后获取文件并将其传递给您的 c++。

【讨论】:

谢谢。我正在寻找类似的东西。【参考方案2】:

如果我理解正确并假设您使用Runtime.exec 启动C++ 程序,您可以将Processs 标准输出流解析为Tika 想要的InputStream。这样行吗?

【讨论】:

我认为这行不通,但我对 Tika 的了解还不够,无法肯定地说。 你和我都有:但我知道你可以做一个Process proc = Runtime.getRuntime().exec(cmd); InputStream is = proc.getInputStream(); 并且你会得到这个过程的输出。您可以将其包装在 BufferedInputStream 中,看看它对您有什么作用。不确定 Tika 将如何区分它和任何其他 InputStream。

以上是关于Apache Tika 和文件访问而不是 Java 输入流的主要内容,如果未能解决你的问题,请参考以下文章

java web项目文件上传中常见的mime类型(基于Apache的tika)

Apache Tika 的进度报告?

如何使用java从excel表提取内容

Apache Tika 提取扫描的 PDF 文件

eclipse 无法导入 apache tika src

apache tika 可以导出excel吗