【问题标题】:Groovy StreamingTemplateEngine IOException: mark() not supportedGroovy StreamingTemplateEngine IOException:不支持标记()
【发布时间】:2020-01-07 07:17:39
【问题描述】:

从现在开始我使用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 工作方式相同,但字符串> 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 或如何摆脱此错误?

【问题讨论】:

  • GeneratorIntegrationTest.groovy:206 中有什么内容?
  • 见:stackoverflow.com/questions/5529754/… - 也许你需要一个缓冲的方法来包装你的资源。
  • @cfrick 这是我触发模板创建的常规测试。我已经尝试过了,但没有成功
  • 请向我们展示完整的堆栈跟踪。

标签: java templates groovy


【解决方案1】:

我是否必须以不同的方式读取 jarFile 或如何摆脱此错误?

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

但是,有一个简单的解决方法。如果您将流包装在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");

【讨论】:

  • BufferedInputStream 不是我的解决方案。查看Reader本身的源文件后,我看到InputStreamReader没有实现mark()方法。超类Reader 有一个只抛出IOException 的方法。
  • 感谢您的回答,我走上了正轨。我会为我的问题添加一个答案。
【解决方案2】:

问题是InputStreamReader。此阅读器未实现 mark() 方法。我认为它是从java.io.Reader 继承的。但是在查看Reader的源代码后,我看到有一个mark()方法,它只会抛出一个异常。 InputStreamReader 不会覆盖它。

所以我像这样从InputStreamReader 创建了一个BufferedReader,它又可以工作了:

Reader reader = new BufferedReader(new InputStreamReader(jarFile.getInputStream(jarEntry), "UTF-8"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多