Java Velocity模板合并方法接受StringWriter,但buff大小不够

Java Velocity模板合并方法接受StringWriter,但buff大小不够,java,velocity,stringwriter,Java,Velocity,Stringwriter,我试图使用Apache POI从包含5000多行和10多个工作表的excel文件中读取数据,我获取所有列和行值并将其存储在ArrayListMultiMap>中,此逻辑工作正常,然后我将此对象存储在VelocityContext中,如下所示: VelocityContext context = new VelocityContext(); context.put("excelMap", excelMap); 我需要在velocity模板中使用此集合,通过迭代exc

我试图使用Apache POI从包含5000多行和10多个工作表的excel文件中读取数据,我获取所有列和行值并将其存储在ArrayListMultiMap>中,此逻辑工作正常,然后我将此对象存储在VelocityContext中,如下所示:

       VelocityContext context = new VelocityContext();
        context.put("excelMap", excelMap);
我需要在velocity模板中使用此集合,通过迭代excelMap来用值填充XML文件,为此:

     VelocityEngine vEngine = new VelocityEngine();
    vEngine.setProperty("resource.loader", "class");
    vEngine.setProperty("class.resource.loader.class",  "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
    Template t = vEngine.getTemplate(vmTemplate);
    **StringWriter sw = new StringWriter(excelMap.size());**
    **t.merge(context,sw)**
但是,StringWriter的容量始终为1024,并且已经尝试将PrintWriter与BufferedWriter、StringBuilderWriter结合使用,当应用程序到达合并行时,它将挂起并最终显示OutOfMemory异常

任何人都可以帮助我,我已经准备好了所有与StringWriter和PrintWriter相关的帖子,但运气不好


谢谢

1024个限制是一个骗局。你不会因此而内存不足。如果写入程序超过初始容量,将分配更多内存。你真正的问题是电子表格和数据,而不是速度

从StringWriter javadocs:

initialSize—在自动展开缓冲区之前,适合该缓冲区的字符值的数量(emphasis mine)


与其将整个电子表格读入内存,不如尝试一次将一个工作表或一个条目转换为XML。可能速度不是你最好的选择

我也在考虑类似的行,但我不能只读取选定的工作表,它必须完整地填充XML中的所有节点,我还尝试将ArrayListMap拆分为更小的映射,但它变得复杂,我花了很大的精力将工作表链接到多重映射中的列值。有没有其他方法可以替代StringWriter?感谢您“不得不”——这只是因为您选择了生成XML的方式。你别无选择-内存不足无法与之协商。我建议不要使用POI。安迪·汗的杰克塞尔是一个更好的选择。不要将数据解析成地图;它们属于一个更好的抽象概念,比如JExcel。一旦你有了这些,处理工作簿中的数据。谢谢,我同意POI不好,但对于Jetcel,我也会遇到同样的问题,因为所有内容都存储在内存中,我决定拆分作业并在单个线程中异步运行,这应该可以解决问题。JExcel会更好——原因如下:您可以交替阅读工作表和生成XML,这样您就永远不会同时将整个电子表格存储在内存中。您将有多个读写步骤来循环所有可用的工作表,而不是读写。一次只能在内存中存储一个。您好@duffymo谢谢,我通过一次将一个测试用例转换为一个XML来解决这个问题。抱歉这么晚才发表评论:)