无法两次读取相同的 InputStream

Can't read the same InputStream twice

这是我的代码:

// 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 的副本(通过 InputStream fileStream2 = fileStream;)并将 fileStream 传递给一个 reader 并将 fileStream2 传递给另一个 reader,但也没用。

我也试过将从 fileStream 提取的 HTML 传递给 Boilerpipe,并将 fileStream 传递给 Tika,但结果是一样的。

我怀疑问题出在同一个InputStream无法读取两次

请问如何将1InputStream的内容传递给2reader?

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

如果您有 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>

我发现 InputStream 不能像 Tika 和 Boilerpipe 在我的旧代码中那样被读取两次,所以我发现我可以读取 fileStream 并将其转换为 String,将其传递给 Boilerpipe,将 String 转换为 ByteArrayInputStream 并将其传递给 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);