0

这是我的代码:

// getFile() method returns the input stream of a local or online file
InputStream fileStream = getFile(source);
// Convert an InputStream to an InputSource
org.xml.sax.InputSource fileSource = new org.xml.sax.InputSource(fileStream);
// Extract text via the Boilerpipe DefaultExtractor
String text = DefaultExtractor.INSTANCE.getText(fileSource);

// Extract text and metadata via Apache Tika
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
ParseContext context = new ParseContext();
AutoDetectParser parser = new AutoDetectParser();
parser.parse(fileStream, handler, metadata, context);

我不明白为什么只有第一个提取器起作用。

在这种情况下,只有Boilerpipe(第一个提取器)工作,而Apache Tika(第二个提取器)无法提取任何东西。

我试图创建fileStream(via InputStream fileStream2 = fileStream;) 的副本并传递fileStream给一个读者和fileStream2另一个读者,但它也不起作用。

fileStream我还尝试将从和Tika中提取的 HTML 传递给 Boilerpipe fileStream,但结果是一样的。

我怀疑问题是InputStream不能读两次。

你能帮我如何传递 1InputStream到 2 位读者的内容吗?

编辑: 我找到了解决方案并将其发布在下面

4

2 回答 2

1

如果您有一个 Maven 项目,则必须包含这些依赖项(在您的pom.xml中)boilerpipe才能正常工作:

 <dependency>
        <groupId>xerces</groupId>
        <artifactId>xercesImpl</artifactId>
        <version>x.y.z</version>
 </dependency>
 <dependency>
        <groupId>net.sourceforge.nekohtml</groupId>
        <artifactId>nekohtml</artifactId>
        <version>x.y.z</version>
</dependency>
于 2017-12-01T12:24:09.113 回答
0

我发现 anInputStream不能像 Tika 和 Boilerpipe 在我的旧代码中那样被读取两次,所以我发现我可以读取fileStream并将其转换为String,将其传递给 Boilerpipe,将其转换String为 aByteArrayInputStream并将其传递给 Tika。这是我的新代码。

// getFile() method returns the input stream of a local or online file
InputStream fileStream = getFile(source);

// Read the value of the InputStream and pass it to the
// Boilerpipe DefaultExtractor in order to extract the text
String html = readFromStream(fileStream);
String text = DefaultExtractor.INSTANCE.getText(html);

// Convert the value read from fileStream to a new ByteArrayInputStream
fileStream = new ByteArrayInputStream(html.getBytes("UTF-8"));

// Extract text and metadata via Apache Tika
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
ParseContext context = new ParseContext();
AutoDetectParser parser = new AutoDetectParser();
parser.parse(fileStream, handler, metadata, context);
于 2017-12-02T17:51:13.940 回答