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

Ted*_*Ted 11 java

我想用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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*ess 18

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

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();
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你应该在while条件下添加`&& length> 0` (3认同)
  • 为什么 b != 10?不确定这 10 个字节是如何发挥作用的。是EOF吗? (2认同)

jua*_*uan 9

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 唯一重要的是你找到问题的解决方案:) (7认同)

小智 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);
}
Run Code Online (Sandbox Code Playgroud)