Dateigröße in .gz-Archiv ermitteln

muhrad

Grünschnabel
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:

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
 
Hi Muhrad,

ist vielleicht nicht die tollste Lösung, aber so könnte es gehen:

Java:
public static long getGzipFileSize(String filename) throws IOException {
		InputStream is = null;
		
		long length = 0L;
		long skipped = 0L;
		
		try {
			is= new GZIPInputStream(new FileInputStream(filename));
			do {
			skipped = is.skip(Long.MAX_VALUE);
			length += skipped;
			}
			while (skipped > 0L);
		}
		finally {	
				if(is != null) {
					is.close();
				}
		}
		
		return length;
	}

Gruß
Jochen
 
Zuletzt bearbeitet von einem Moderator:
Hi,

das ist zumindest schonmal eine Variante die funktioniert. Leider muss ich auch hier die Datei einmal inhaltlich durchlaufen. Bei den zugrundeliegenden Logs muss ich somit alleine auf die Größenberechnung 3-4 Sekunden warten. Mir ist das zu lang...entscheiden tut es aber letztendlich jemand anders ;)

Insofern schonmal Danke dafür. Auf die Idee mit Skip zu arbeiten kam ich nicht (ist gemessen an der Laufzeit ja wesentlich fixer als das wirkliche Verarbeiten der gelesenen Daten).
 

Neue Beiträge

Zurück