删除文本文件中的最后一行

我想用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(); } } } } 

如果要在不创建新文件的情况下从文件中删除最后一行,可以执行以下操作:

 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(); 

从倒数第二个字节开始,寻找换行符,并继续向后搜索,直到找到一个。 然后在换行后截断文件。

如果最后一个字符是换行符(即最后一行的结尾),则从倒数第二个字节而不是最后一个字节开始。

您正在创建一个替换旧文件的新文件,您需要这样的东西

 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(); } } 

上面的答案需要稍加修改,以处理文件中只剩下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); } 

您正在以覆盖模式打开文件(因此单个write操作将擦除文件的整个内容),要在追加模式下打开它应该是:

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

此外,它不会删除最后一行:虽然读者已到达文件的当前最后一行,但编写者最后一行之后 – 因为我们在上面指定了应该使用追加模式。

看看这个答案 ,了解你将要做的事情。

我从其他人那里受益,但代码无效。 这是我在android studio上的工作代码。

 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(); }