gpt4 book ai didi

java - 我可以将 Velocity 模板与 InputStreams 一起使用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:28 25 4
gpt4 key购买 nike

我正在处理大文件,我需要将 XML 包装在 base64 负载周围。我的第一个天真的实现将负载作为 java.lang.String 传递到 [Velocity template][0],但是对于大文件我想使用 java.io.InputStream 相反。

这是我的模板:

<?xml version="1.0" encoding="UTF-8"?>
<Request>
<AdditonalParameters>
#if( $headers.additionalParameters )
#foreach( $key in $headers.additionalParameters.keySet() )
<Parameter>
<Key>${key}</Key>
<Value>${headers.additionalParameters.get($key)}</Value>
</Parameter>
#end
#end
</AdditonalParameters>
<Content>${body}</Content>
</Request>

$body 可能非常大,所以我想避免使用 Stringbyte[]。是否可以将 InputStream 作为 $body 传递到我的模板中,或者我不能为此使用 Velocity?

最佳答案

是的,这是可以做到的。它所需要的只是一个逐行打印 InputString 的迭代。由于 Velocity 缺少类似于 while 的构造,并且只知道 foreach 循环,因此迭代在其最简单的实现中看起来像是一个丑陋的 hack:

#foreach ($i in [0..100000])
#set ($line = false)
#set ($line = $body.readLine())
#if ($line)
${line}
#else
#break
#end
#end

这里使用一个非常大的数值范围来模拟无限循环。当无法从 InputStream($body)中提取更多行时,循环将#break。第三行有一个警告:

#set (line = $body.readLine())

与 Velocity 一样,只有当右侧的值不为空时,赋值的左侧才会发生变化。由于永远不会为 $line 分配空值,因此我们需要将其预先设置为 false( boolean 值,而不是 返回的字符串读取行)。这样,如果在第二个 #set 之后 $line 仍然是 false,我们就知道 readLine 返回了 null 并且是时候退出迭代了。

这种方法的一个问题是在模板中插入行之间的空格。有一些技巧可以避免这种情况(see here)。此外,#foreach hack 可以通过创建一个 Java List 来避免,它的 iterator() 方法返回一个 Iterator遍历 InputStream 的行。这会减少 KISS,但会使您的代码更可重用。

关于java - 我可以将 Velocity 模板与 InputStreams 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19564320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com