Hallo
ich möchte ein log.file schreiben in welchen nur die letzten 2000 zeilen enthalten sind.
Mein Lösungsvorschlag währe
die Datei (log.file) in eine Hashmap einzulesen und als Schlüssel die Zeilenzahl zu verwenden ( sprich ein index der Automatisch mit jeder Zeile hochgezählt wird)
Soll nun ein neuer Eintrag in die Datei geschrieben werden, wird dieser zunächst wieder in die Hashmap geschrieben.
Um am Ende heauszubekommen wieviel Zeilen (sprich wieviel Elemente die HashMap enthält wollte ich die Methode Hashmap.size() verwenden.
Ist diese ermittelte Zahl größer als die 2000 Zeilen
Lösche ich die ersten Elemente aus der Map bis die Gleichung gleich ist.
Und nun meine Frage hab ich vlt an irgendetwas nicht gedacht das mir bei dieser Lösung ein Strich durch die Rechnung macht.
Oder gibt es einen einfacheren Weg?
ich würd eine linkedlist verwenden. beim befüllen fragst du die größe ab, wenn sie bereits 2000 ist, löscht du das erste element und fügst das neue element am ende hinzu, ansonsten einfach am ende hinzufügen. das könnt ca. so aussehen:
Java:
int MAX_SIZE =2000;String line =null;List<String> erg =newLinkedList<String>();while((line = reader.readLine())!=null){if(erg.size()== MAX_SIZE){
erg.removeFirst();}
erg.add(line);}
Vielen Dank für den Vorschlag.
Eine Frage habe ich noch zu LinkedList werden die Zeilen da auch wirklich der Reihe nach abgespeichert und nicht durcheinander.
klar, ist eine List und kein Set. schau dir mal, wenn du Zeit hast, das Collection Framework an. Also: List, Set und Map und die unterschiede bei den jeweiligen Implementierungen.
da werd ich dein Vorschlag gleich mal zum Einsatz bringen.
Ein was habe ich jedoch vergessen. Da die Datei in einer Datenbank abgespeichert ist bekomme ich
Mit folgenden Code gleich den gesamten Inhalt raus
ahh, wenn das so ist schaut die lösung eigentlich ganz anders aus. wenn du die ganze datei in einem string objekt hast, musst du eigentlich nur nach dem return (Enter) splitten. die letzten 2000 felder sind dann die, die du willst:
Mit Hilfe des StringTokenizer teile bekomme ich die einzelnen Zeilen. Als Trennzeichen dient "\n" was ja in der txt für den Zeilenumbruch genutzt wird.
Werd ich mal dein Vorschlag testen da ich auf diese Weise ein Schleife weniger nutze
danke
hab es mal getestet
wenn ich jedoch bei lines.length() mal ausgebe bekomme ich immer eine Länge von 1 raus.
Die Datei enhält jedoch 10 Zeilen
Java:
String lineSeparator =System.getProperty("line.separator");String[] lines = logfile.split(lineSeparator);System.out.println(lines.length);String[]line =null;if(lines.length>2000){
line =newString[2000];System.arraycopy(lines, lines.length -2000, line,0,2000);}else{
line=lines;System.out.println(line.length +" das is de länge");}