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++ 程序,您可以将Process
s 标准输出流解析为Tika 想要的InputStream
。这样行吗?
【讨论】:
我认为这行不通,但我对 Tika 的了解还不够,无法肯定地说。 你和我都有:但我知道你可以做一个Process proc = Runtime.getRuntime().exec(cmd); InputStream is = proc.getInputStream();
并且你会得到这个过程的输出。您可以将其包装在 BufferedInputStream
中,看看它对您有什么作用。不确定 Tika 将如何区分它和任何其他 InputStream。以上是关于Apache Tika 和文件访问而不是 Java 输入流的主要内容,如果未能解决你的问题,请参考以下文章