2013-07-18 53 views
10

我正在用Java清除文本文件中的最後一行;但是,下面的代碼會刪除所有內容。刪除文本文件中的最後一行

public void eraseLast() 
{ 
    while(reader.hasNextLine()) { 
     reader.nextLine(); 

     if (!reader.hasNextLine()) { 
      try { 
       fWriter = new FileWriter("config/lastWindow.txt"); 

       writer = new BufferedWriter(fWriter); 
       writer.write(""); 
       writer.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+1

可能重複(http://stackoverflow.com/questions/9149648/deleting-the-last-line-of-a-file-with-java ) –

+2

提供的答案都是不合適的。他們將通過2 gig文件循環而不是截斷文件。你想要做的是找到最後一行結尾和截斷:http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#truncate(long) –

+1

@DMoses,非常感謝你說,我對錶演非常感興趣,所以我會這樣做 – Ted

回答

17

如果你想刪除文件的最後一行,而無需創建一個新的文件,你可以這樣做這個:

RandomAccessFile f = new RandomAccessFile(fileName, "rw"); 
long length = f.length() - 1; 
do {      
    length -= 1; 
    f.seek(length); 
    byte b = f.readByte(); 
} while(b != 10); 
f.setLength(length+1); 
f.close(); 

從第二個最後一個字節開始,尋找一個換行字符,並繼續向後尋找,直到找到一個爲止。然後在換行之後截斷文件。

如果最後一個字符是換行符(即最後一行的結尾),則從第二個字節開始,而不是最後一個字節。

+2

你應該添加'&&長度> 0'到while條件 – bachr

4

你打開覆蓋模式的文件(因此單write操作會清除文件的全部內容),在追加模式下打開它,它應該是:

fWriter = new FileWriter("config/lastWindow.txt", true); 

而且此外,它不會刪除最後一行行:雖然讀者已經到達文件的當前最後一行,但是在最後一行之後,作者是- 因爲我們上面指定了應該使用附加模式。

看看這個answer瞭解你將要做的事情。

+0

謝謝你告訴我,並幫助 – Ted

8

您正在創建真實新人換舊人一個新的文件,你想是這樣的

public void eraseLast() { 
    StringBuilder s = new StringBuilder(); 
    while (reader.hasNextLine()) { 
     String line = reader.readLine(); 
     if (reader.hasNextLine()) { 
      s.append(line); 
     } 
    } 
    try { 
     fWriter = new FileWriter("config/lastWindow.txt"); 
     writer = new BufferedWriter(fWriter); 

     writer.write(s.toString()); 

     writer.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
+0

非常感謝,我沒有選擇你的答案的唯一原因是因爲我用James Holdernesss '回答 – Ted

+6

唯一重要的是,你找到了解決你的問題:) – juan

5

上面的答案需要稍微修改,以應對那裏是隻有1留在文件中(否則你會得到一個IOException負尋求偏移量)線的情況下:

RandomAccessFile f = new RandomAccessFile(fileName, "rw"); 
long length = f.length() - 1; 
do {      
    length -= 1; 
    f.seek(length); 
    byte b = f.readbyte(); 
} while(b != 10 && length > 0); 
if (length == 0) { 
f.setLength(length); 
} else { 
f.setLength(length + 1); 
} 
+0

你需要檢查文件大小是否大於0; - ) –

+0

'readByte'方法應該是正確的大寫 – mikelsr

0

我從別人受益但代碼不起作用。這是我在android studio上的工作代碼。 [刪除與Java文件的最後一行]的

File file = new File(getFilesDir(), "mytextfile.txt"); 
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); 
byte b; 
long length = randomAccessFile.length() ; 
if (length != 0) { 
    do { 
     length -= 1; 
     randomAccessFile.seek(length); 
     b = randomAccessFile.readByte(); 
    } while (b != 10 && length > 0); 
    randomAccessFile.setLength(length); 
    randomAccessFile.close(); 
} 
相關問題