參考我以前的帖子處理龐大的管道分隔的文件
Remove first line from a delimited file
我能夠處理較小的文件,並刪除第一行....但櫃面的大文件存在的內存問題因爲我正在閱讀整個文件,然後再將其寫回。
有人可以提出一個更好的替代這個問題。
感謝您的提前。
維韋克
參考我以前的帖子處理龐大的管道分隔的文件
Remove first line from a delimited file
我能夠處理較小的文件,並刪除第一行....但櫃面的大文件存在的內存問題因爲我正在閱讀整個文件,然後再將其寫回。
有人可以提出一個更好的替代這個問題。
感謝您的提前。
維韋克
你要讀文件中的行由行,寫在地方:
BufferedReader reader = new BufferedReader(new FileReader("foo.txt"));
PrintWriter writer = new PrintWriter(new FileWriter("_foo.txt"));
String line;
boolean firstLine = true;
while ((line = reader.readLine()) !=null) {
if (!firstLine) {
writer.println(line);
firstLine = false;
}
}
+1:單獨的'reader.readLine();'會讀取並放棄一行。不需要'firstLine' –
爲了避免重寫整個文件來刪除一條線,你可以保持一個索引來了「開始「的文件。這個索引是你相信開始的地方,你會從哪裏開始閱讀文件。定期例如每晚一次,您可以重寫該文件,以便該「啓動」是文件實際啓動的位置。
這個「開始」位置可以存儲在另一個時間或在現有文件的開始。
這意味着您可以漸進式地「移除」文件的所有行,而無需重新編寫它。
刪除第一行涉及重寫整個文件。隨着文件的增長,行數會增加,但重寫文件的大小也會增加。即這是一個O(n^2)操作。你應該考慮別人已經提出的另一種方法。 –
是的,確切地說。那就是問題,重新編寫整個文件是一項昂貴的任務。如果文件的大小爲GB,那麼它肯定是一個問題。 我已經試過FileChannel和RandomAccessFile,但它證明在大文件的情況下是低效的。而使用BufferedReader/PrintWriter也會涉及到重新寫入整個文件,我想避免這種情況。 我不確定任何其他方法,你能建議嗎? – Vivek