从现在起,我使用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中,它表示
SimpleTemplateEngine
和StreamingTemplateEngine
的工作原理相同,但对于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");