Zeilen aus einer Textdatei löschen

dasago

Mitglied
Hey Leute, ich lese mit folgendem Code eine Textdatei aus:

Code:
public void berechnen() {
                String anzahl;
		try {
		    //Datei lesen
		    File filename = new File("test.txt");
		    FileReader eingabe = new FileReader(filename);
		    BufferedReader pInFile = new BufferedReader(eingabe);
		    while ((zeile = pInFile.readLine()) != null) {
		    	anzahl = anzahl + 1;
		    }
		    eingabe.close();
		} 
		catch (IOException e) {
		    e.printStackTrace();
		}
}

Die Variable Anzahl gibt mir an, wieviel Zeilen die Textdatei besitzt. Nun möchte ich, dass die letzten 7 Zeilen jeweils gelöscht werden, wenn die Datei 500 Zeilen besitzt. Wie kann ich dies umsetzen? Das werd ich wohl mit ner If Anweisung machen (If anzahl >= 500), aber wie lösch ich dann jeweils die letzten 7 Zeilen der Datei?
 
Ganz einfach. Du schreibst alles, bis auf die letzten 7 Zeilen in eine neue Datei. Das geht mit den entsprechenden Gegenstücken zu Deinen Readern.
Anschließend beendest Du die Reader und Writer.
Damit nun Deine neue Datei nicht zusätzlich da ist, sondern es so aussehen soll, als ob Du aus der ersten Datei die letzten 7 Zeilen gelöscht hast, benennst Du sie einfach um:
Code:
myNewFile.renameTo(filename);
filename.delete();

Zusätzlich dazu möchte ich Dir noch einen Tipp geben, falls Du mal das gleiche Spiel mit größeren Dateien treiben willst. Dazu kannst Du RandomAccessFile benutzen:
Code:
// Dein Code, zusätzlich noch die Bytes gezählt
RandomAccessFile myNewRAFile = new RandomAccessFile(filename, "rw");
myNewRAFile.setLength(myByteLengthBeforeLast7Lines); // das war's
 
Danke für dein Tipp, aber so hab i es mir au scho gedacht!

Wie bekomm ich denn raus, wie groß die Bytelänge ist vor den letzten sieben Zeilen?

Es wird ja nicht immer das gleiche reingeschrieben.

beschäftige mich erst seit nem Monat mit Java.. sry!

Ich les wenn dann immer nur alle Bytes ein.
 
Zuletzt bearbeitet:
Also ich habs nun auf ne andere Variante geschafft. Kannst mir sagen ob die komplizierte ist bzw. um einiges länger dauert als deine? So funktionierts.. Schreiben tu ichs dann mit ner 3. Prozedur die ich nicht gepostet hab. Da wird einfach dann die Variable speicher geschrieben! Muss man bei deinem auch 2 mal die Datei lesen oder wie geht es sosnt, dass die letzten 8 Zeilen nicht mitbestimmt werden? Bei deinem Befel zeile.length() geht die Prozedur ja wiederum alle Zeilen durch.. somit müsste man auch erst einmal alle Zeilen zählen und dann 7 abziehn wie bei mir oder?

Code:
	public void read() {
		berechnen();
		try {
		    //Datei lesen
		    File filename = new File("test.txt");
		    FileReader eingabe = new FileReader(filename);
		    BufferedReader pInFile = new BufferedReader(eingabe);
	    	if (anzahl <= 806){ // Bestimmt die Dateilänge! - 6 Ap - 8 hochzählen
			    for (int i = 0; i < anzahl;i++){
					zeile = pInFile.readLine();
				    	speicher = speicher + zeile + "\n";	    
			    }
		    }
	    	else {
			    for (int i = 0; i < anzahl - 8 ;i++){ // Datei wird um 8 Zeilen gekürzt
					zeile = pInFile.readLine();
				    	speicher = speicher + zeile + "\n";
				    	x = x + zeile.length();
				    
			    }
	    	}
		    //System.out.println("X: " + x);
		    pInFile.close();
		} 
		catch (IOException e) {
		    e.printStackTrace();
		    }
	}

Code:
	private void berechnen() {
		try {
		    //Datei lesen
		    File filename = new File("test.txt");
		    FileReader eingabe = new FileReader(filename);
		    BufferedReader pInFile = new BufferedReader(eingabe);
	    			    while ((zeile = pInFile.readLine()) != null) {
		    	anzahl = anzahl + 1;
		    }
		    eingabe.close();
		} 
		catch (IOException e) {
		    e.printStackTrace();
		    }
		}
 
Zuletzt bearbeitet:
Zurück