tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
576
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    muhrad muhrad ist offline Rookie
    Registriert seit
    Mar 2010
    Beiträge
    8
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
                // 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 :
    1
    2
    
    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
     

  2. #2
    Avatar von joschi70
    joschi70 joschi70 ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Beiträge
    143
    Hi Muhrad,

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

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    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
     

  3. #3
    muhrad muhrad ist offline Rookie
    Registriert seit
    Mar 2010
    Beiträge
    8
    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).
     

  4. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    eine möglichkeit wäre es mit einem Konsolen Kommande über ProcessBuilder die Inhalte (+größe) des tar.gz Files auszugeben und diese
    Ausgabe zu parsen.

    Dateien aus einem tar entpacken kann man übrigens auch mit Ant-Tar:
    http://www.koders.com/java/fid5AE405...9BA9C0AC8.aspx

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  5. #5
    muhrad muhrad ist offline Rookie
    Registriert seit
    Mar 2010
    Beiträge
    8
    geht nur um *.gz (ohne tar).

    Konsolenkommandos muesste ich mal checken.
     

Ähnliche Themen

  1. Dateigröße eines IMG ermitteln?
    Von FunkyMonkey im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 18.08.07, 22:28
  2. Dateigröße ermitteln?
    Von Kriz im Forum VisualStudio & MFC
    Antworten: 4
    Letzter Beitrag: 22.05.05, 20:34
  3. Dateigröße in KB oder MB ermitteln
    Von qsrs im Forum PHP
    Antworten: 4
    Letzter Beitrag: 23.01.05, 16:31
  4. Dateigröße ermitteln
    Von d4kine im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 15.11.04, 15:31
  5. Dateigröße ermitteln
    Von big hero im Forum PHP
    Antworten: 2
    Letzter Beitrag: 24.11.02, 15:13