2013-07-18 38 views
10

Ich bin dabei, die letzte Zeile in einer Textdatei mit Java zu löschen; Der folgende Code löscht jedoch alles.Letzte Zeile in Textdatei löschen

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

möglich Duplikat [Löschen der letzten Zeile einer Datei mit Java] (http://stackoverflow.com/questions/9149648/deleting-the-last-line-of-a-file-with-java) –

+2

Die vorgestellten Antworten sind alle innecient. Sie durchlaufen eine 2-Gig-Datei, anstatt nur die Datei abzuschneiden. Was Sie tun möchten, ist die letzte Zeile zu finden, die endet und abschneidet: http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#truncate(long) –

+1

@DMoses, Vielen Dank für das sagen, ich bin sehr daran interessiert, die Leistung, so werde ich das tun – Ted

Antwort

17

Wenn Sie die letzte Zeile aus der Datei, ohne eine neue Datei löschen wollten, man könnte etwas tun, wie dies:

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

Beginnen Sie beim vorletzten Byte, suchen Sie nach einem Zeilenvorschub-Zeichen, und suchen Sie weiter rückwärts, bis Sie einen finden. Kürzen Sie dann die Datei nach diesem Zeilenvorschub.

Sie beginnen mit dem vorletzten Byte anstelle des letzten, falls das letzte Zeichen ein Zeilenvorschub ist (d. H. Das Ende der letzten Zeile).

+2

Sie sollten '&& Länge> 0' hinzufügen, während die Bedingung – bachr

4

Sie die Datei im Schreibmodus zu öffnen (und somit eine einzige write Operation wird den gesamten Inhalt der Datei wischen), es Modus in append öffnen sollte es sein:

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

Und Außerdem wird es die letzte Zeile nicht löschen: obwohl der Leser die aktuelle letzte Zeile der Datei erreicht hat, ist der Schreiber nach die letzte Zeile - weil wir oben angegeben, dass der Append-Modus verwendet werden sollte.

Werfen Sie einen Blick auf diese answer, um eine Vorstellung davon zu bekommen, was Sie tun müssen.

+0

Vielen Dank für das Erzählen mir und für die Hilfe – Ted

8

Sie eine neue Datei erstellt, die die alten sind zu ersetzen, wollen Sie so etwas wie diese

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

Vielen Dank, der einzige Grund, warum ich nicht wählte Ihre Antwort war, weil ich James Holderness verwendet 'Antwort – Ted

+6

Die einzige wichtige Sache ist, dass Sie eine Lösung für Ihr Problem finden :) – juan

5

Die Antwort oben leicht modifiziert werden muss, um den Fall zu behandeln, in denen es nur 1 Zeile in der Datei links ist (sonst erhalten Sie einen IOException erhalten für negative Offset SEEK):

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

Und Sie müssten überprüfen, ob die Dateigröße größer als 0 ist oder nicht; -) –

+0

'readByte' Methode sollte korrekt groß geschrieben werden – mikelsr

0

ich von anderen profitiert aber der Code hat nicht funktioniert. Hier ist mein Arbeitscode auf 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(); 
} 
Verwandte Themen