从现在起,我使用SimpleTemplateEngine处理模板。我从JarFile获取模板文件,并使用如下读取器创建模板:

Reader reader = new InputStreamReader(jarFile.getInputStream(jarEntry), "UTF-8");
Template template = engine.createTemplate(reader);
String fileString = template.make(model).toString();


这个工作正常,但是现在我需要从一个更大的文件中创建一个模板,因此SimpleTemplateEngine无法处理此问题,因为它限制为〜64K。


  groovy.lang.GroovyRuntimeException:无法解析模板脚本
  (您的模板可能包含错误或正在尝试使用表达式
  当前不支持):启动失败:
  SimpleTemplateScript1.groovy:5614:字符串太长。给定的字符串
  长度为298596个Unicode代码单位,但最多只能包含65535个
  允许的。


documentation中,它表示SimpleTemplateEngineStreamingTemplateEngine的工作原理相同,但对于Strings> 64K。当我切换引擎时,出现此错误:

编辑堆栈跟踪:

java.io.IOException: mark() not supported
        at java.io.Reader.mark(Reader.java:232) ~[na:1.8.0_181]
        at groovy.text.StreamingTemplateEngine$StreamingTemplate.handleEscaping(StreamingTemplateEngine.java:556) ~[groovy-templates-2.5.7.jar!/:2.5.7]
        at groovy.text.StreamingTemplateEngine$StreamingTemplate.<init>(StreamingTemplateEngine.java:460) ~[groovy-templates-2.5.7.jar!/:2.5.7]
        at groovy.text.StreamingTemplateEngine.createTemplate(StreamingTemplateEngine.java:215) ~[groovy-templates-2.5.7.jar!/:2.5.7]


我是否必须以其他方式读取jarFile或如何摆脱该错误?

最佳答案

我是否必须以其他方式读取jarFile或如何摆脱该错误?


看来InputStream返回的ZipFile::getInputStream没有实现标记/重置。

但是,有一个简单的解决方法。如果将流包装在BufferedInputStream中,后者将对缓冲区中的数据实施标记/重置。而且,如果将缓冲区设置为ZipEntry的大小,则可以缓冲整个流。例如

int size = jarEntry.getSize();  // Might return -1.
BufferedInputStream bis = new BufferedInputStream(jarEntry.getInputStream(),
                                                  Math.max(size, 8192))
Reader reader = new InputStreamReader(bis, "UTF-8");

10-07 17:00