删除文本文件中的最后一行
我想用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(); }