12

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

6 回答 6

21

如果您想从文件中删除最后一行而不创建新文件,您可以执行以下操作:

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

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

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

于 2013-07-18T19:52:41.530 回答
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();
    }
}
于 2013-07-18T19:39:56.790 回答
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);
}
于 2015-01-21T15:28:40.490 回答
4

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

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

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

看看这个答案,了解你必须做什么。

于 2013-07-18T19:39:19.060 回答
1

我从其他人那里受益,但代码不起作用。这是我在 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();
}
于 2016-03-05T06:42:06.493 回答
0

这是我的解决方案

private fun removeLastSegment() {
    val reader = BufferedReader(FileReader(segmentsFile))
    val segments = ArrayList<Segment>()
    var line: String?
    while (reader.readLine().also { line = it } != null) {
        segments.add(Gson().fromJson(line, Segment::class.java))
    }
    reader.close()

    segments.remove(segments.last())
    var writer = BufferedWriter(FileWriter(segmentsFile))
    writer.write("")
    writer = BufferedWriter(FileWriter(segmentsFile, true))
    for (segment in segments) {
        writer.appendLine(Gson().toJson(segment))
    }
    writer.flush()
    writer.close()
    lastAction--
    lastSegment--
}
于 2020-11-25T10:14:42.540 回答