【问题标题】:Can't read the same InputStream twice无法两次读取相同的 InputStream
【发布时间】:2017-11-29 19:02:16
【问题描述】:

这是我的代码:

// 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 传递给另一位读者,但它也不起作用。

我还尝试将提取自fileStreamfileStream 的 HTML 传递给 Boilerpipe,但结果是一样的。

我怀疑问题是同一个InputStream不能被读取两次。

您能帮我如何将 1 个InputStream 的内容传递给 2 个读者吗?

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

【问题讨论】:

    标签: java inputstream apache-tika boilerpipe


    【解决方案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>
    

    【讨论】:

      【解决方案2】:

      我发现 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);
      

      【讨论】:

        猜你喜欢
        • 2018-10-24
        • 2012-09-10
        • 2020-06-25
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多