2011-07-18 46 views
0

參考我以前的帖子處理龐大的管道分隔的文件

Remove first line from a delimited file

我能夠處理較小的文件,並刪除第一行....但櫃面的大文件存在的內存問題因爲我正在閱讀整個文件,然後再將其寫回。

有人可以提出一個更好的替代這個問題。

感謝您的提前。

維韋克

+0

刪除第一行涉及重寫整個文件。隨着文件的增長,行數會增加,但重寫文件的大小也會增加。即這是一個O(n^2)操作。你應該考慮別人已經提出的另一種方法。 –

+0

是的,確切地說。那就是問題,重新編寫整個文件是一項昂貴的任務。如果文件的大小爲GB,那麼它肯定是一個問題。 我已經試過FileChannel和RandomAccessFile,但它證明在大文件的情況下是低效的。而使用BufferedReader/PrintWriter也會涉及到重新寫入整個文件,我想避免這種情況。 我不確定任何其他方法,你能建議嗎? – Vivek

回答

1

你要讀文件中的行由行,寫在地方:

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; 
    } 
} 
+0

+1:單獨的'reader.readLine();'會讀取並放棄一行。不需要'firstLine' –

0

爲了避免重寫整個文件來刪除一條線,你可以保持一個索引來了「開始「的文件。這個索引是你相信開始的地方,你會從哪裏開始閱讀文件。定期例如每晚一次,您可以重寫該文件,以便該「啓動」是文件實際啓動的位置。

這個「開始」位置可以存儲在另一個時間或在現有文件的開始。

這意味着您可以漸進式地「移除」文件的所有行,而無需重新編寫它。