2013-07-18 4 views
10

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

возможно дубликат [Удаление последней строки файла с Java] (http://stackoverflow.com/questions/9149648/deleting-the-last-line-of-a-file-with-java) –

+2

Все представленные ответы являются исчерпывающими. они будут прокручивать 2-гигабайтный файл, а не просто обрезать файл. То, что вы хотите сделать, это найти последнюю строку, заканчивающуюся и обрезать: http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#truncate(long) –

+1

@DMoses, большое спасибо за то, что сказал, что я очень заинтересован в производительности, поэтому я сделаю это – Ted

ответ

17

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

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

you shoud add '&& length> 0' до условия – bachr

4

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

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

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

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

+0

спасибо, что сообщили мне об этом и за помощь – Ted

8

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

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

Большое спасибо, единственная причина, по которой я не выбрал ваш ответ, был потому, что я использовал James Holdernesss 'Ответ – Ted

+6

Единственное, что вы нашли решение своей проблемы: – juan

5

Ответ выше должен быть слегка изменен, чтобы иметь дело со случаем, когда есть остается в файле (в противном случае, вы получаете IOException для отрицательных стремятся смещения) только 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 && length > 0); 
if (length == 0) { 
f.setLength(length); 
} else { 
f.setLength(length + 1); 
} 
+0

И вам нужно будет проверить, больше ли размер файла больше 0 или нет;) –

+0

Метод 'readByte' должен быть скорректирован с использованием – mikelsr

0

Я выиграл от других но код не работал. Вот мой рабочий код на студии 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(); 
} 
Смежные вопросы