java中實現,在大檔案的第一行新增內容

2021-08-15 11:53:41 字數 2679 閱讀 7423

需求描述:

最近在寫乙個定時任務,傳送多次請求到介面,介面返回報文寫入到乙個檔案中,檔案要求格式第一行為總數。這個總數只能在最後的時候才能知道,

這就相當於提出了乙個要求:在檔案的第一行新增內容,以前的內容整體向下偏移一行。

遇到的問題:

我開始做的方法是,在**中 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...