[英]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
传递给一个阅读器,并将fileStream2
传递给另一阅读器,但是它也不起作用。
我也尝试将从fileStream
提取的HTML传递到Boilerpipe,然后将fileStream
传递给Tika,但是结果是相同的。
我怀疑问题是同一InputStream
无法读取两次。
您能帮我如何将1 InputStream
的内容传递给2个读者吗?
编辑:我找到了解决方案,并将其张贴在下面
如果您有一个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
并传递提卡。 这是我的新代码。
// 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.