需求描述:
最近在寫乙個定時任務,傳送多次請求到介面,介面返回報文寫入到乙個檔案中,檔案要求格式第一行為總數。這個總數只能在最後的時候才能知道,
這就相當於提出了乙個要求:在檔案的第一行新增內容,以前的內容整體向下偏移一行。
遇到的問題:
我開始做的方法是,在**中 new stringbuffer ,等全部報文返回後,把返回的報文先全部儲存到buffer中,用printwriter寫入總數到檔案,再將返回報文寫入。可在實際**執行中,由於每次返回的報文都存入到buffer中,返回的報文物件被buffer物件引用,沒有釋放掉,所以占用記憶體很大。折騰了半天不可行。只能換一種思路了。這個檔案大小是50多m,記憶體幾百兆沒了。
那既然一次性儲存到buffer中不行,那就返回一次報文就儲存到本地臨時檔案中tmpfile,最後在另乙個檔案dinsfile中先寫入總數,從tmpfile沒讀取一行,就寫入到dinsfile。一開始沒想到用scammer這個類,從網上看其他網友的博文才發現正適合,還是很菜,多多學習。
這樣占用記憶體的問題就解決了。下面上**:
public class querybondbaltask extends baseservice
public void getbondbaltotext()
//解析返回backmsg,生成臨時檔案
inputstream input1 = new bytearrayinputstream(backmsg.getbytes());
reader = new inputstreamreader(input1);
document document = saxreader.read(reader);
element root = document.getrootelement();
// 獲取債券賬號
node accountnode = root.selectsinglenode("//id");
string account = accountnode.gettext();
// 餘額條數
list acctldglist = root.selectnodes("//acctldg");
int size = acctldglist.size();
// 獲取所有標籤
listbdlist = root.selectnodes("//bd");
for (element bond : bdlist)
}pw.flush();
sum = sum + size;
}//將總數寫入檔案
writesum(sum,tmpfile);
} catch (filenotfoundexception e) catch (documentexception e) catch (exception e) finally
tmpfile.delete();
if (reader != null) catch (ioexception e)
}} }
private string createxml(string bondid) catch (documentexception e)
element root = document.getrootelement();
node txflowidnode = root.selectsinglenode("//txflowid");
string txflowid = sequencecreater.getrecontxflowid();
txflowidnode.settext(txflowid);
node credtnode = root.selectsinglenode("//credttm");
string credt***ate = datetimeclass.getcurformattime();
credtnode.settext(credt***ate);
node startnode = root.selectsinglenode("//startdt");
string startdate = datetimeclass.getcurformatdate();
startnode.settext(startdate);
node endnode = root.selectsinglenode("//enddt");
string enddate = datetimeclass.getcurformatdate();
endnode.settext(enddate);
node idnode = root.selectsinglenode("//id");
idnode.settext(bondid);
string requestxml = document.asxml();
return requestxml;
} //讀取檔案,將總數寫入
private void writesum(long sum, file tmpfile)
pw.print("end");
pw.flush();
} catch (filenotfoundexception e) finally
if (pw != null)
if (input != null) catch (ioexception e)
}} }
}
vi中跳到檔案的第一行和最後一行
a 輸入 0 或者 1 回車 b 鍵盤按下 小寫 gg a 輸入 回車 b 鍵盤按下大寫 g c 鍵盤按 shift g 其實和第二種方法一樣 vim快速移動游標至行首和行尾 1 需要按行快速移動游標時,可以使用鍵盤上的編輯鍵home,快速將游標移動至當前行的行首。除此之外,也可以在命令模式中使用快...
批量刪除TXT檔案第一行和最後一行
終於實現了把python用起來,記錄一下,環境為python3.7,看了一些網上的方法,但這總算是乙個不錯的開端。import os import os.path import codecs 這裡放著你要操作的資料夾名稱 path c users rym desktop 金融 後復權 後復權a股全 ...
shell中第一行 bin bash的作用
shell中 bin bash bin ksh 這些東西是幹什麼的,有用嗎?是乙個約定的標記,它告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種 shell。這些不是注釋符,而是說明下面的指令碼是在什麼shell下面執行的,並且以該shell環境來執行指令碼,乙個簡單的例子 bin ksh ex...