Textdatei auf gewünschte Anzahl der Zeilen kürzen

xote

Mitglied
Hallo allerseits,

Ich schreibe gerade eine eigene Logging-Klasse, dabei versuche ich gerade eine log-Datei (Textdatei) auf die gewünschte Anzahl von Zeilen zu kürzen. Eine funktionierende Lösung habe ich wie es aussieht schon gefunden, allerdings ist diese Lösung auch enorm langsam.

Im Grunde genommen mache ich das im Moment so: vom log-file wird die Zeilenanzahl ermittelt, wenn die höher ist als die gewünschte Zeilenanzahl wird das log-file getrimmt. Dazu werden alle Zeilen wieder in eine Liste gelesen, diese dann entsprechend gekürzt, dann das alte log-file gelöscht und neu geschrieben.

Wie gesagt läuft mir das irgendwie viel zu langsam. Ich hätte mir auch schon überlegt, den Inhalt der Liste ständig im Speicher zu halten aber das erscheint mir dann doch noch verschwenderischer.

Hat vielleicht irgendwer einen besseren Ansatz? Oder gibt es Verbesserungen am Code selbst? Wo verschenke ich vielleicht viel Laufzeit?

Danke im Voraus...

Java:
	private void trimLogFileToMaximumLines(File textFile, int maximumLines, boolean trimAtBegin) {
		int actualLogFileLineCount = countLinesInTextFile(logFile);
		if(actualLogFileLineCount > maximumLines) {
			ArrayList<String> logFileLines = new ArrayList<String>();
			try {
				FileReader fr = new FileReader(logFile);
				LineNumberReader ln = new LineNumberReader(fr);
				try {
					boolean linesLeft = true;
					while(linesLeft) {
						String line = ln.readLine();
						if(line == null) {
							linesLeft = false;
						} else {
							logFileLines.add(line);
						}
					}
				} catch (IOException ioe) {
					ioe.printStackTrace();
				}
			} catch (FileNotFoundException fnfe) {
				fnfe.printStackTrace();
			}
			logFile.delete();
			while(logFileLines.size() > maximumLines) {
				if(trimAtBegin) {
					logFileLines.remove(0);
				} else {
					logFileLines.remove(logFileLines.size()-1);
				}
			}
			for (String line : logFileLines) {
				appendLogEntryToLogFile(line);
			}
		}
	}
Java:
	public int countLinesInTextFile(File logFile) {
		int count = 0;
		if(logFile.exists()) {
			try {
				FileReader fr = new FileReader(logFile);
				LineNumberReader ln = new LineNumberReader(fr);
				try {
					while(ln.readLine() != null) {
						count++;
					}
					ln.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
		}
		return count;
	}
Java:
	private void appendLogEntryToLogFile(String composedLogMessage) {
		boolean append = true;
		FileWriter fw = null;
		try {
			fw = new FileWriter(logFile,append);
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
		try {
			fw.write(composedLogMessage + System.getProperty("line.separator"));
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
		try {
			fw.close();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
	}
 

HimBromBeere

Top Contributor
Java:
while(logFileLines.size() > maximumLines) {
    // ...
    logFileLines.remove(logFileLines.size()-1);
}
Bin mir zwar nicht sicher, aber hier könnte´s u.U. krachen, da du zwar immer schön Zeilen löschst, aber die Größe der Liste sich gar nicht ändert... hab ich aber nicht überprüft, ist nur ´ne Vermutung.

Nichtsdestotrotz noch ein kleiner Tipp: wenn du dreimal eine IOException fangen und auf die gleiche Art und Weise verarbeiten willst (in deinem Fall e.()), dann kannst du die auch alle zusammenschmeißen, da wird´s etwas übersichtlicher.
Java:
 boolean append = true;
        FileWriter fw = null;
        try {
            fw = new FileWriter(logFile,append);
            fw.write(composedLogMessage + System.getProperty("line.separator"));
            fw.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
Selbes gilt für dieses Konstrukt hier:
Java:
try {
                FileReader fr = new FileReader(logFile);
                LineNumberReader ln = new LineNumberReader(fr);
                try {
                    boolean linesLeft = true;
                    while(linesLeft) {
                        String line = ln.readLine();
                        if(line == null) {
                            linesLeft = false;
                        } else {
                            logFileLines.add(line);
                        }
                    }
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            } catch (FileNotFoundException fnfe) {
                fnfe.printStackTrace();
            }
Ordne das mal alles ein bisschen, sieht ja kein Mensch mehr durch...
 
S

Spacerat

Gast
^^ Erstens das und zweitens, warum die Datei beim Zählen, Kürzen und anschliessendem Verwenden immer wieder neu Laden? Das dürfte so eine Art "Log-Daily" werden, blos halt mit fester Zeilenzahl, statt mit einem festen Zeitraum. Drittens:
Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;


public class SimpleLogDemo
{
	public enum MsgType {
		INFO(0),
		WARN(1),
		FAIL(2),
		;

		private final int level;

		private MsgType(int level)
		{
			this.level = level;
		}
	}

	private static final int MAX_ENTRYS = 20;

	private final String logFile;
	private FileWriter log;
	private MsgType type = MsgType.INFO;
	private int entrys;

	private SimpleLogDemo(String logFile)
	{
		this.logFile = logFile;
		try {
			File file = new File(logFile);
			log = new FileWriter(file, file.exists());
		} catch(IOException e) {
			// shouldn't happen
		}
	}

	public void setLevel(MsgType type)
	{
		if(type == null) {
			throw new NullPointerException("type may not be null");
		}
		this.type = type;
	}

	public void log(String msg, MsgType type)
	throws IOException
	{
		msg = "["+ type.toString() + "] " + msg + "\n";
		if(type.level >= this.type.level) {
			log.write(msg);
			entrys++;
		}
		if(entrys == MAX_ENTRYS) {
			log.close();
			File file = new File(logFile);
			File renamed = new File(logFile + "." + System.currentTimeMillis());
			file.renameTo(renamed);
			log = new FileWriter(file, false);
		}
	}

	public void splitOldLogs(File logFile)
	throws IOException
	{
		BufferedReader reader = new BufferedReader(new FileReader(logFile));
		String line;
		if((line = reader.readLine()) != null) {
			log("copy of " + line, MsgType.INFO);
		}
		reader.close();
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
S Textdatei statt von Dateisystem aus .jar lesen Allgemeine Java-Themen 3
curranux Ausgabe als Textdatei schreiben. Allgemeine Java-Themen 2
killig Textdatei einlesen und in HashMap speichern (duplikate entfernen) Allgemeine Java-Themen 12
B Scanner erkennt keinen Text in Textdatei, obwohl welcher drinsteht Allgemeine Java-Themen 10
M In Textdatei schreiben Allgemeine Java-Themen 3
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
J Bestimmte Zeile aus Textdatei auslesen Allgemeine Java-Themen 18
OnDemand Download Textdatei falsches Charset Allgemeine Java-Themen 1
K Textdatei als Objekt Allgemeine Java-Themen 4
O JAR Export Textdatei benutze Allgemeine Java-Themen 14
stylegangsta Mehrere html seiten einer Homepage einlesen und als Textdatei ausgeben Allgemeine Java-Themen 14
L Filewriter schreibt Zahlen in Textdatei Allgemeine Java-Themen 2
D Input/Output Zeilen werden "ignoriert" beim Einlesen aus einer Textdatei Allgemeine Java-Themen 3
T Synchronisation einer Textdatei im Groupshare Allgemeine Java-Themen 1
I String einer Textdatei anfügen Allgemeine Java-Themen 2
S Von Wav Datei mit Morsecode in Morsecode als Textdatei Allgemeine Java-Themen 2
R Duplikate aus einer Textdatei entfernen? Allgemeine Java-Themen 20
K Input/Output Ausgabe in Textdatei Allgemeine Java-Themen 7
Iron Monkey Inhalt von JTable in die Textdatei mit StringWidth schreiben Allgemeine Java-Themen 3
J Textdatei auslesen, die gerade benutzt wird Allgemeine Java-Themen 8
P Textdatei aus Ressourcen laden. Allgemeine Java-Themen 8
W Auslesen von Textdatei Allgemeine Java-Themen 16
M gleichzeitiger Zugriff auf eine Textdatei Allgemeine Java-Themen 6
S TextDatei in Panel anzeigen Allgemeine Java-Themen 10
S Input/Output Latin-9 (ISO 8859-15) Textdatei einlesen Allgemeine Java-Themen 2
L Input/Output Textdatei in Objekte überführen? Allgemeine Java-Themen 4
F In mitten einer Textdatei schreiben Allgemeine Java-Themen 7
N Textdatei in Jar Problem Allgemeine Java-Themen 6
B Leerzeile in Textdatei Allgemeine Java-Themen 3
B Textdatei Zeilen auslesen Allgemeine Java-Themen 7
E BlueJ Daten in Textdatei schreiben Allgemeine Java-Themen 21
D große Textdatei filtern Allgemeine Java-Themen 13
K Textdatei komplett auslesen bis auf 2 Zeilen Allgemeine Java-Themen 2
H Textdatei (1GB) einlesen und verarbeiten Allgemeine Java-Themen 15
S String verschlüsselt in Textdatei speichern Allgemeine Java-Themen 3
E Text ans Ende einer Textdatei anfügen Allgemeine Java-Themen 2
Balbes Dateipfad in den JFileChooser aus Textdatei einlesen Allgemeine Java-Themen 7
S Textdatei mit externen Editor öffnen Allgemeine Java-Themen 8
G Textdatei einlesen unter Windows 7 Allgemeine Java-Themen 4
A Textdatei im Applet einlesen Allgemeine Java-Themen 2
C Textdatei einlesen Allgemeine Java-Themen 3
L Textdatei nach Wörter durchsuchen Allgemeine Java-Themen 3
Psypsy Bits in Textdatei und zurück Allgemeine Java-Themen 3
A Zeilen aus einer Textdatei löschen Allgemeine Java-Themen 6
ModellbahnerTT Problem: Schleife über Textdatei Allgemeine Java-Themen 5
W Auslesen einer Textdatei Allgemeine Java-Themen 2
D HILFE - Textdatei im jar auslesen Allgemeine Java-Themen 10
T Auslesen und schreiben in eine Textdatei.HILFE!HILFE! Allgemeine Java-Themen 23
G Mit FileWriter in Textdatei über jar Allgemeine Java-Themen 4
E textdatei über "öffnen mit" aufrufen Allgemeine Java-Themen 6
A Objekte in Textdatei weiterschreiben Allgemeine Java-Themen 5
M Textdatei auslesen / schreiben (Server) Allgemeine Java-Themen 9
D Textdatei umbenennen Allgemeine Java-Themen 2
C Software für Windows PC mit integierter Db oder Textdatei? Allgemeine Java-Themen 19
G 2 zeilen in textdatei beim auslesen verbinden Allgemeine Java-Themen 10
D Zeilenvorschub aus einer Textdatei rausnehmen Allgemeine Java-Themen 11
J Textdatei oder doch DB? Allgemeine Java-Themen 2
T GUI mit DB oder Textdatei? Allgemeine Java-Themen 11
G Textdatei in String einlesen Allgemeine Java-Themen 2
M Inhalt von Textdatei in Spinner Allgemeine Java-Themen 5
M neue Textdatei DOS/Unix-Format Allgemeine Java-Themen 11
E Zeilenumbruch in einer Textdatei Allgemeine Java-Themen 2
E Zeilenbumbruch in einer Textdatei Allgemeine Java-Themen 3
D Textdatei und JTextArea Allgemeine Java-Themen 5
M Worte aus Textdatei mit Java ersetzen Allgemeine Java-Themen 4
G Unterscheidung: Binär- oder Textdatei Allgemeine Java-Themen 13
B Zeilenumbruch bei Schreiben einer Textdatei Allgemeine Java-Themen 10
M Textdatei per Request lesen? Allgemeine Java-Themen 2
L Textdatei einlesen und verändern Allgemeine Java-Themen 3
M Problem: Textdatei einlesen Allgemeine Java-Themen 2
Y Einlesen & Ausgeben einer Textdatei _2 Allgemeine Java-Themen 3
Y Einlesen & Ausgeben einer Textdatei Allgemeine Java-Themen 5
M Fehler beim öffnen einer 20 mb Textdatei im sign. Applet Allgemeine Java-Themen 5
byte Erste Zeile einer Textdatei entfernen Allgemeine Java-Themen 5
G Eingaben in Textdatei speichern Allgemeine Java-Themen 5
P Einlesen einer Textdatei Allgemeine Java-Themen 8
P Problem beim "spliten" eine Textdatei Allgemeine Java-Themen 3
T jar + Textdatei Allgemeine Java-Themen 2
X Bestimmtes Muster in Textdatei verändern Allgemeine Java-Themen 13
G Inhalt einer Textdatei in eine AWT List schreiben Allgemeine Java-Themen 3
G auslesen einer Textdatei Allgemeine Java-Themen 2
E Source-Code aus einer Textdatei kompilieren und ausführen Allgemeine Java-Themen 4
D Textdatei zeilenweise einlesen Allgemeine Java-Themen 2
M Eingabe von Arrays geht über gewünschte Anzahl hinaus Allgemeine Java-Themen 2
D JFrame vergrößert nicht auf die gewünschte Größe Allgemeine Java-Themen 2
BeginnerJava Anzahl der 5 % - Zuwächse ausgeben Allgemeine Java-Themen 6
M Wie übergebe ich den Zähler für die Anzahl Rekursionsschritte korrekt? Allgemeine Java-Themen 2
S BlockingQueue mit dynamischer Anpassung der Anzahl von Producer und Consumer Threads Allgemeine Java-Themen 1
S Iterable<?> anzahl der Element Allgemeine Java-Themen 14
M Java- Bild gewissen Anzahl von Sekunden anzeigen?! Allgemeine Java-Themen 4
F Best Practice Große Anzahl an Objekten speichern und lesen Allgemeine Java-Themen 19
M Relative Anzahl an verschachtelten Forschleifen Allgemeine Java-Themen 8
The Pi Anzahl der Gewichtscheiben berechnen Allgemeine Java-Themen 11
P Threads Parallelisierte DB-Abfragen mit variabler Anzahl an Threads Allgemeine Java-Themen 4
Soloeco BubbleSort Anzahl der Vertauschungen Allgemeine Java-Themen 9
J Anzahl geöffneter Plugins Allgemeine Java-Themen 3
A Anzahl an Threads Systemweit Allgemeine Java-Themen 2
J Anzahl von Möglichkeiten zur Verteilung von Kugeln in Behälter Allgemeine Java-Themen 3
P Erste Schritte Dynamische Anzahl von verschachtelten Schleifen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben