Java - lösche die Zeile aus der Textdatei, indem du sie beim Lesen überschreibst

8

Ich versuche, eine Textzeile aus einer Textdatei zu löschen, ohne sie in eine temporäre Datei zu kopieren. Ich versuche dies zu tun, indem ich einen Druckerschreiber und einen Scanner benutze und gleichzeitig die Datei durchquere. Der Schreiber schreibt, was der Scanner liest und überschreibt jede Zeile mit demselben Ding, bis es zu der Zeile kommt, die ich möchte löschen. Dann schiebe ich den Scanner, aber nicht den Schreiber, und fahre fort wie zuvor. Hier ist der Code:

Aber zuerst die Parameter: Meine Dateinamen sind Zahlen, also würde das 1.txt oder 2.txt usw. heißen, und so gibt f den Dateinamen an. Ich wandle es im Konstruktor für eine Datei in einen String um. Int n ist der Index der Zeile, die ich löschen möchte.

%Vor%

Es gibt mir seltsame Fehler. Im Stack-Trace heißt es "NoSuchElementException" und "no line found". Es weist auf verschiedene Linien hin; Es scheint, dass jeder der nextLine () -Aufrufe dies tun kann. Ist es möglich, eine Zeile auf diese Weise zu löschen? Wenn ja, was mache ich falsch? Wenn nicht, warum? (BTW, nur für den Fall, dass Sie das wollen, die Textdatei ist etwa 500 Zeilen. Ich weiß nicht, ob das als groß oder sogar zählt.)

    
Shelley 25.06.2011, 12:38
quelle

3 Antworten

19

Wie andere bereits erwähnt haben, ist es besser, eine temporäre Datei zu verwenden, wenn das Risiko besteht, dass Ihr Programm in der Mitte abstürzt:

%Vor%

(Achten Sie auf die schlampige Behandlung von Codierungen, Zeilenumbrüchen und Ausnahmebehandlung.)

Allerdings beantworte ich keine Fragen mit " Ich werde dir nicht sagen wie, denn du solltest es sowieso nicht machen. ". (In einer anderen Situation zum Beispiel arbeiten Sie möglicherweise mit einer Datei, die größer ist als die Hälfte Ihrer Festplatte!) Also hier:

Sie müssen stattdessen ein RandomAccessFile verwenden. Mit dieser Klasse können Sie mit demselben Objekt lesen und in die Datei schreiben:

%Vor%     
aioobe 25.06.2011, 13:05
quelle
2

Sie können es nicht so machen. FileWriter kann nur an eine Datei anhängen, anstatt in der Mitte zu schreiben - Sie benötigen RandomAccessFile, wenn Sie in der Mitte schreiben möchten. Was Sie jetzt tun - Sie überschreiben die Datei beim ersten Schreiben (und sie wird leer - deshalb erhalten Sie die Ausnahme). Sie können FileWriter mit Append-Flag erstellen, das auf "true" gesetzt ist. Auf diese Weise würden Sie jedoch an eine Datei anhängen und nicht in der Mitte schreiben.

Ich würde wirklich empfehlen, in eine neue Datei zu schreiben und sie am Ende umzubenennen.

    
Jarek Potiuk 25.06.2011 13:02
quelle
1

@Shelley: Sie können nicht tun, was Sie versuchen zu tun, und was mehr ist, sollten Sie nicht. Sie sollten die Datei lesen und aus verschiedenen Gründen in eine temporäre Datei schreiben. Zum einen ist es möglich, dies zu tun (im Gegensatz zu dem, was Sie tun wollen) und zum anderen, wenn der Prozess beschädigt wird, könnten Sie Ballen machen ohne Verlust der ursprünglichen Datei aus. Sie könnten jetzt einen bestimmten Speicherort einer Datei mit einer RandomAccessFile-Datei aktualisieren. Dies geschieht jedoch (meiner Erfahrung nach), wenn Sie mit Datensätzen mit fester Größe statt mit typischen Textdateien arbeiten.

    
Hovercraft Full Of Eels 25.06.2011 12:54
quelle

Tags und Links