为什么我无法重用InputStream?

时间:2012-11-15 06:45:58

标签: java

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

请告诉我如何再次阅读?

5 个答案:

答案 0 :(得分:2)

您只能读取一次流,然后您就是EOF,正如错误消息所示。你想要做的事情没有意义。

答案 1 :(得分:1)

在达到蒸汽结束时无法重新开始读取输入流,因为它仅向单向移动。

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

e.g。

    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);

希望这有帮助。

答案 2 :(得分:1)

我不确定你在getXSLOutput做了什么以及为什么你需要读取相同的输入流100次但为了避免EOF你可以使用mark(int)来标记你的流的开头getXSLOutput方法,并在同一方法的末尾调用reset。看起来好像做错了......

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

答案 3 :(得分:0)

您不能在文件中重复使用输入流而不关闭它。所有文件I / O功能都依赖于EOF来停止。

答案 4 :(得分:0)

对于每个xls文件,您必须解析文件并创建Java的Excel Document实例。 该Java实例将为您提供InputStream。所以在这种情况下你无法逃脱。

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