项目需求中有一个地方需要读取xml文件上传到mongoDb里,我先将xml文件转成List集合以后,将整个List一起写入了本地文件,引用了第三方jar包SequenceWriter,采用了直接将集合写成数组的方法写入文件,具体代码如下:
ObjectMapper mapper = new ObjectMapper();
try(FileWriter fileWriter = new FileWriter(file,true);
SequenceWriter sequenceWriter = mapper.writer().writeValueAsArray(fileWriter)){
sequenceWriter.writeAll(cmdEchos);
}catch(Exception e){
log.error("本地文件写入失败",e);
}
本地运行发现,原有的xml大小252kb,写入到本地文件的大小450kb!!!指数级增加,导致一些大的xml文件直接把虚拟机内存占满,显示设备空间不足,直接崩溃!后来改变了写入本地文件的方法,采用FileUtils.writeStringToFile(file,cmdEchos,StandardCharsets.UTF_8),本地文件大小和xml几乎相同了。
FileUtils.writeStringToFile(file,cmdEchos,StandardCharsets.UTF_8)会将整个Collection转成json又复制一份,容易堆内存溢出,改为一行行写入,代码如下:
try(BufferedWriter bw = new BufferedWriter(new FileWriter(file))){
for(int i=0;i<cmdEchos.size();i++){
CmdEcho cmdEchoMap = new CmdEcho();
cmdEchoMap.put("cmd",cmdEcho.getCmd());
cmdEchoMap.put("echo",cmdEcho.getEcho());
if(i == 0){
bw.write("["+JSON.toJsonString(cmdEchoMap));
}else{
bw.write(","+JSON.toJsonString(cmdEchoMap));
}
}
bw.write("]");
}
目前解决了这一问题,下一步要看一下SequenceWriter的writeAll方法的源码,看下他在写入的时候到底额外添加了什么内容,等待后续补充!