无法两次读取相同的 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);
这是我的代码:
// 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);