0
public static String getTextOf(String xsl) throws Exception {
      DocXHandler docxh1 = new DocXHandler(ACE.getInputFilePath());
      InputStream inputDocumentXMLStream = docxh1.getInputDocumentXMLZERO();
    return new Cache().getXSLOutput(inputDocumentXMLStream, xsl);
}

使用不同的 xsl 参数将调用上述方法超过 100 次。现在每次 InputStream inputDocumentXMLStream 都被赋值(是的,超过 100 次)。当我试图重构这段代码时,只有一次 InputStream 将被赋值。我的代码现在变成了这样,

  public static String getTextOf(String xsl) throws Exception {
     return new Cache().getXSLOutput(inputDocumentXMLStream, xsl);
   }

通过将 inputDocumentXMLStream 更改为全局属性。我第一次得到正确的结果,但第二次得到以下错误,

Unexpected end of ZLIB input stream

所以请告诉我如何再读一遍?

4

5 回答 5

2

如错误消息所述,您只能读取一次流,然后您处于 EOF。你试图做的事情没有意义。

于 2012-11-15T06:50:47.853 回答
1

到达蒸汽末端后,您无法重新开始读取输入流,因为它仅单向移动。

我认为解决您的问题的最佳方法是一次完全解析您的 XML 文件并将值放在一些 java 对象中。完成后,您可以简单地使用映射来检索所需的值。这也将非常有效。

例如

    Object parseValueMap = paseXML(inputDocumentXMLStream);//use appropriate object
    //^ called only once, you may use some libraries such as JAXB to parse the xml

假设xsl是一个路径表达式,您可能希望将路径应用于在上述步骤中创建的 Java 集合。您可以使用以下库JXPath

     String value = JXPathEvaluator(parseValueMap, xsl);

希望这可以帮助。

于 2012-11-15T07:02:32.083 回答
1

我不确定您在做什么getXSLOutput以及为什么需要读取相同的输入流 100 次,但是为了避免 EOF,您可以使用mark(int)在方法中标记流的开始并在结束时getXSLOutput调用reset同样的方法。不过好像做错事了……

为了获得更好的结果,请尝试读取一次并将内容存储在 Java 中的数据类型中,然后处理 100 次。

于 2012-11-15T07:04:45.437 回答
0

对于每个 xls 文件,您必须解析文件并创建 Java 的 Excel 文档实例。该 Java 实例将为您提供 InputStream。因此,在这种情况下,您无处可逃。

但是对于同一个文件,您可以使用相同的 InputStream。那将是一个单一的单元或工作。

于 2012-11-15T06:58:46.917 回答
0

您不能在不关闭文件的情况下重用输入流。所有文件 I/O 函数都依赖 EOF 来停止。

于 2012-11-15T06:53:10.283 回答