2009-09-02 70 views
1

有人知道如何從文本文件中刪除行。從Java中的大文本文件中刪除行

我正在尋找別的東西,而不是逐行閱讀和寫入,並跳過你想要刪除的行。

例如:我的文件計數1346線,我想刪除線520

+0

你有沒有機會知道最後一行的內容? – stefita 2009-09-02 13:19:10

+0

你知道這條線的位置嗎?或者你知道這條線是什麼樣的? – LB40 2009-09-02 13:44:36

+0

我可以讓我的程序計算出行的位置,是的。 – 2009-09-02 13:54:09

回答

4

一個文本文件中的行號是不是支持零成本重組。它只是一個連續的字節序列。如果要從文件中間刪除一些字節(並且通過暗示將所有後續字節移到覆蓋刪除的字節),則必須複製並重新寫入所有以下字節。

您有幾個選項。將整個文件讀入內存,執行刪除操作,然後將文件寫出。 (希望能夠在成功完成寫入之後將原始文件重命名爲臨時文件),或者只需從源文件中讀取數據緩衝區中的數據並做一些工作即可完成一些奇特的步驟。

+0

感到抱歉我會做同樣的評論:不管語言如何,在文件中間刪除字節沒有任何魔力(在大部分操作系統我都知道,至少)。所以我只是給你的答案+1。 – PhiLho 2009-09-02 15:04:16

0

你可以閱讀整個文件中,做一個正則表達式替換(假設你知道確切的匹配等),然後寫入文件退出。

個人我不知道有多少價值的這個答案:)

+0

這就像我解釋的方式。我不想讀寫。 – 2009-09-02 13:35:53

+0

好吧,我誤解了你的問題 – 2009-09-02 22:50:00

0

好,如果你知道長度(或最後一行的內容):

long lastLineLength = lastLine.length(); 
RandomAccessFile raf = new RandomAccessFile("RandFile.txt", "rw"); 
long length = raf.length(); 
raf.setLength(length - lastLineLength); 
raf.close(); 
+0

這是我想要的更多,但它只是最後一行 – 2009-09-02 13:51:20

+0

對不起,不能理解你的評論 – stefita 2009-09-02 13:56:23

+0

@stefita你只刪除最後一行。這不是問題,我猜他想刪除任意一行。 – LB40 2009-09-02 14:33:49

2

解決方案是否需要用Java編寫? UNIX命令sedgrep僅用於此目的,並可能表現更好。如果您正在運行Windows,則可以通過Cygwin訪問這些工具,或者可能有本地端口。

+0

我同意,但我懷疑這個問題應該有一個「家庭作業」標籤,因此它必須留在Java。 (請注意數字52O中的字母'O',而不是520. – 2009-09-02 14:06:49

+0

對於O – 2009-09-02 14:24:02

1

是的。羅布是對的。 試試這個

sed -e '520d' <yourfile> 

輸出重定向到新文件

這裏520是要刪除