Hi,
ein Log-File-Parser hat je nach dem, ob er ein aktuelles Log oder eins von Vortagen analysieren soll eine .log (plain text) oder eine "gezippte" Variante .log.gz vorliegen.
In beiden Fällen ist es kein Problem, an die eigentliche Datei zu kommen:
Da die Log-Files aber durchaus mal etwas größer werden können und für einen Tag bereits ~1 Mio. Zeilen enthalten können, dauert das einlesen schon ein paar Sekunden. Daher wollte ich (mit Bezug auf Dateigröße und bereits eingelesene Bytes eine Fortschrittsanzeige einbauen.
Für die normalen Logs ist das kein Problem. Hier entspricht file.length() ja der Größe der eingelesenen Datei. Bei einer log.gz entspricht es allerdings der Größe der gezippten Datei. Eingelesen wird ja später die entpackte und daher deutlich größere Datei.
Gibt es eine Möglichkeit an die Größe einer in einer Gzip gepackten Datei zu kommen, ohne sie aus dem Inputstream erst wieder in eine Datei schreiben zu lassen (deren Größe ich dann wiederrum bestimme).
Naiv ausgedrückt suche ich sowas wie (mit der imaginären Klasse GZFile):
Beispielhaft ist ein (noch etwas überschaubarerer Log-File 26MB groß. als .gz bringt er es nur noch zu 2,2MB.
P.S.: Klar könnte ich für einige Beispiele mal schauen wie sich der Faktor gepackt zu entpackt verhält und den auf die gz-Datei-Größe aufschlagen. Aber wenns geht hätte ich die Größe gerne tatsächlich bestimmt und nicht geschätzt.
Gruß und Danke vorab
Muhrad
ein Log-File-Parser hat je nach dem, ob er ein aktuelles Log oder eins von Vortagen analysieren soll eine .log (plain text) oder eine "gezippte" Variante .log.gz vorliegen.
In beiden Fällen ist es kein Problem, an die eigentliche Datei zu kommen:
Code:
// Log-Datei und entsprechenden Reader definieren
FileInputStream datei = new FileInputStream(dateiPfad);
BufferedReader dateiReader = null;
// Gepackter Log-File -> *.log.gz ?
if (dateiPfad.contains(".gz")) {
// Liegt das Log als .gz vor, muss ein GZIPInputStream darum gelegt werden
InputStream entzippteDatei = new GZIPInputStream(datei);
dateiReader = new BufferedReader(new InputStreamReader(entzippteDatei, "ISO-8859-15"));
} else {
// oder normaler Log-File -> *.log ?
dateiReader = new BufferedReader(new InputStreamReader(datei, "ISO-8859-15"));
}
Da die Log-Files aber durchaus mal etwas größer werden können und für einen Tag bereits ~1 Mio. Zeilen enthalten können, dauert das einlesen schon ein paar Sekunden. Daher wollte ich (mit Bezug auf Dateigröße und bereits eingelesene Bytes eine Fortschrittsanzeige einbauen.
Für die normalen Logs ist das kein Problem. Hier entspricht file.length() ja der Größe der eingelesenen Datei. Bei einer log.gz entspricht es allerdings der Größe der gezippten Datei. Eingelesen wird ja später die entpackte und daher deutlich größere Datei.
Gibt es eine Möglichkeit an die Größe einer in einer Gzip gepackten Datei zu kommen, ohne sie aus dem Inputstream erst wieder in eine Datei schreiben zu lassen (deren Größe ich dann wiederrum bestimme).
Naiv ausgedrückt suche ich sowas wie (mit der imaginären Klasse GZFile):
Code:
GZFile gz = new GZFile(dateiPfad)
long size = GZFile.getContent().length();
Beispielhaft ist ein (noch etwas überschaubarerer Log-File 26MB groß. als .gz bringt er es nur noch zu 2,2MB.
P.S.: Klar könnte ich für einige Beispiele mal schauen wie sich der Faktor gepackt zu entpackt verhält und den auf die gz-Datei-Größe aufschlagen. Aber wenns geht hätte ich die Größe gerne tatsächlich bestimmt und nicht geschätzt.
Gruß und Danke vorab
Muhrad