Удалить последнюю строку в текстовом файле

Я связываю стирание последней строки в текстовом файле с помощью 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

Если вы хотите удалить последнюю строку из файла без создания нового файла, вы можете сделать что-то вроде этого:

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

Вы создаете новый файл, который заменяет старый, вы хотите что-то вроде этого

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

Ответ 3

Ответ выше должен быть слегка изменен, чтобы иметь дело с случаем, когда в файле осталось только 1 строка (иначе вы получите исключение IOEx для отрицательного смещения поиска):

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

Ответ 4

Вы открываете файл в режиме перезаписывания (поэтому одна операция write уничтожит все содержимое файла), чтобы открыть его в режиме добавления, это должно быть:

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

И кроме того, он не собирается удалять последнюю строку: хотя читатель достиг последней текущей строки файла, сценарий после последней строки - потому что мы указали выше, что должен использоваться режим добавления.

Посмотрите на этот ответ, чтобы получить представление о том, что вам нужно делать.

Ответ 5

Я получал пользу от других, но код не работал. Вот мой рабочий код на студии Android.

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