需求描述:
最近在写一个定时任务,发送多次请求到接口,接口返回报文写入到一个文件中,文件要求格式第一行为总数。这个总数只能在最后的时候才能知道,
这就相当于提出了一个要求:在文件的第一行添加内容,以前的内容整体向下偏移一行。
遇到的问题:
我开始做的方法是,在代码中 new StringBuffer ,等全部报文返回后,把返回的报文先全部保存到buffer中,用PrintWriter写入总数到文件,再将返回报文写入。可在实际代码运行中,由于每次返回的报文都存入到buffer中,返回的报文对象被buffer对象引用,没有释放掉,所以占用内存很大。折腾了半天不可行。只能换一种思路了。这个文件大小是50多M,内存几百兆没了。
那既然一次性保存到buffer中不行,那就返回一次报文就保存到本地临时文件中tmpFile,最后在另一个文件dinsFile中先写入总数,从tmpFile没读取一行,就写入到dinsFile。一开始没想到用Scammer这个类,从网上看其他网友的博文才发现正适合,还是很菜,多多学习。
这样占用内存的问题就解决了。下面上代码:
public class QueryBondBalTask extends BaseService{
private String url;
private Logger logger = Logger.getLogger(QueryBondBalTask.class);
public void setUrl(String url) {
this.url = url;
}
public void getBondBalToText() {
ICstpCustodianConfigDao cstpCustodianConfigDao = (ICstpCustodianConfigDao) context.getBean("ICstpCustodianConfigDao");
List list = cstpCustodianConfigDao.selectCustodianAccount();
// 创建输出临时文件
String date = DateTimeClass.getCurDate();
String name = "tmp_bond_subject_csbs_" + date + "_.txt";
String t