Java 为什么我不能重用InputStream?

Java 为什么我不能重用InputStream?,java,Java,上述方法将使用不同的xsl参数调用100多次。现在每次为InputStream inputDocumentXMLStream赋值的次数都超过了100次。当我试图重构这段代码时,只有一次InputStream被赋值。我的代码现在变成了这样 public static String getTextOf(String xsl) throws Exception { DocXHandler docxh1 = new DocXHandler(ACE.getInputFilePath());

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

public static String getTextOf(String xsl) throws Exception {
      DocXHandler docxh1 = new DocXHandler(ACE.getInputFilePath());
      InputStream inputDocumentXMLStream = docxh1.getInputDocumentXMLZERO();
    return new Cache().getXSLOutput(inputDocumentXMLStream, xsl);
}
通过将inputDocumentXMLStream更改为全局属性。第一次我得到了正确的结果,但第二次我得到了以下错误

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

请告诉我如何再次读取它?

您只能读取一次流,然后您就处于EOF,正如错误消息所说。您试图执行的操作没有意义。

您只能读取一次流,然后您就处于EOF,正如错误消息所说。您试图执行的操作毫无意义。

如果不关闭输入流,就无法跨文件重用输入流。所有文件I/O功能都依赖于EOF停止

在不关闭输入流的情况下,不能跨文件重用输入流。所有文件I/O功能都依赖于EOF停止

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


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

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

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

在到达蒸汽末端后,无法重新读取输入流,因为它只朝一个方向移动

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

e、 g

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

希望这能有所帮助。

在到达蒸汽末端后,无法重新读取输入流,因为它只朝一个方向移动

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

e、 g

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


希望这能有所帮助。

我不知道您在getXSLOutput中做了什么,也不知道为什么需要将同一个inputstream读取100次,但是为了避免EOF,您可以使用EOF在getXSLOutput方法中标记流的开始,并在同一方法的结尾调用。似乎做了一件错误的事


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

我不确定您在getXSLOutput中执行的操作,以及为什么需要将同一输入流读取100次,但为了避免EOF,您可以使用它在getXSLOutput方法中标记流的开始,并在结束时调用同样的方法。似乎做了一件错误的事


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

@Kate:这应该会有帮助。我理解,与一遍又一遍地读取同一个文件相比,它在编程方面的额外工作很少。但是一旦完成,我认为它会更好。@Kate建议不要在映射中保存输入流,这是一种非常糟糕的方法。您应该使用InputStream或其他方法打开文件,解析文件以构建文件的内存表示形式,并具有便于通过此结构进行访问和导航的方法。@LuiggiMendoza:我已经提到过,我不建议使用任何特定的java对象。我试图分享一次解析文件并重用解析对象的想法。没有别的了。希望这能澄清。她在删除的评论中问,将输入流存储在地图中是否是一个好主意,我只是试图引导她先说这是个坏主意。@LuiggiMendoza Ohh好的。谢谢:@Kate:应该会有帮助的。我理解,与一遍又一遍地读取同一个文件相比,它在编程方面的额外工作很少。但是一旦完成,我认为它会更好。@Kate建议不要在映射中保存输入流,这是一种非常糟糕的方法。您应该使用InputStream或其他方法打开文件,解析文件以构建文件的内存表示形式,并具有便于通过此结构进行访问和导航的方法。@LuiggiMendoza:我已经提到过,我不建议使用任何特定的java对象。我是
尝试分享一次解析文件并重用已解析对象的想法。没有别的了。希望这能澄清。她在删除的评论中问,将输入流存储在地图中是否是一个好主意,我只是试图引导她先说这是个坏主意。@LuiggiMendoza Ohh好的。谢谢:@ramsinb-我尝试了mark0和reset,得到了“java.io.IOException:mark/reset not supported”。这表明DocXHandler.getInputDocumentXMLZERO返回的InputStream的实现没有实现mark或reset方法,因此这种方法不起作用。您应该看看填充Java数据结构并在100个方法调用中使用它的替代方法。@ramsinb-谢谢您的评论,我依赖于此。@ramsinb-我尝试了mark0和reset,得到了“java.io.IOException:mark/reset not supported”。这表明DocXHandler.getInputDocumentXMLZERO返回的InputStream的实现没有实现mark或reset方法,因此此方法不起作用。您应该看看填充Java数据结构并在100个方法调用中使用它的替代方法。@ramsinb-谢谢您的评论,我正依赖于此。
Unexpected end of ZLIB input stream
    Object parseValueMap = paseXML(inputDocumentXMLStream);//use appropriate object
    //^ called only once, you may use some libraries such as JAXB to parse the xml
     String value = JXPathEvaluator(parseValueMap, xsl);