Advanced   Java   Services Lesen und Schreiben von .gz-Dateien


Die Klassen GZIPOutputStream und GZIPInputStream

Mit den beiden Klassen GZIPOutputStream und GZIPOutputStream kann man Dateien im GNUzipped Format packen und entpacken. Das aus der Unix-Welt stammende Format kann genau eine Datei komprimieren.
Zunächst wieder eine Übersicht über die beiden Klassen


GZIPOutputStream
Wichtige Konstruktoren
GZIPOutputStream(OutputStream out) Creates a new output stream with a default buffer size.
Wichtige Methoden
ReturntypName der Methode
void write(byte[] buf, int off, int len)
Writes array of bytes to the compressed output stream.

GZIPInputStream
Wichtige Konstruktoren
GZIPInputStream(InputStream in) Creates a new input stream with a default buffer size.
Wichtige Methoden
ReturntypName der Methode
int read(byte[] buf, int off, int len)
Reads uncompressed data into an array of bytes.

gz-Dateien erstellen

Zu komprimierende Datei einlesen
BufferedInputStream bis = null;

try
{
   String fileName = "irgendeine.xxx" ;
   bis = new BufferedInputStream(new FileInputStream(fileName));
   int avail = bis.available();
   if ( avail>0 )
   {
      byte[] buffer = new byte[avail] ;
      bis.read(buffer, 0, avail) ;
   }
}
catch(IOException ex)
{
   //...
}
finally
{
   try
   {
      if(bis!=null) bis.close();
   }
   catch(Exception ex)
   {
   }
}

Datei im .gz Format wegschreiben
GZIPOutputStream gos=new GZIPOutputStream(new FileOutputStream("irgendeine.xxx.gz"));
gos.write(buffer, 0, buffer.length);
gos.close();

gz-Dateien lesen und entpacken
GZIPInputStream gis = null;
BufferedOutputStream bos = null;

try
{
   String fileName = "test.xxx.gz" ;
   gis = new GZIPInputStream(new FileInputStream(fileName));
   bos = new BufferedOutputStream(new FileOutputStream("test.xxx"));

   int ch;
   while ((ch = gis.read()) != -1)
   {
      bos.write(ch)  ;
   }
}
catch(IOException ex)
{
   //...
}
finally
{
   try
   {
      if(bos!=null) bos.close();
      if(gis!=null) gis.close();
   }
   catch(Exception ex)
   {
   }
}

Hinweis

Obwohl man mit einem Objekt vom Typ GZIPInputStream die ganze .gz-Datei einlesen kann, liefert die Methode available() immer den Wert 1 (bzw. 0 am Dateiende). Man kann diese Methode hier nicht verwenden, um festzustellen, wieviele Byte tatsächlich anliegen. Die Größe der Datei ist erst nach dem Entpacken bekannt. Will man nicht, wie oben, byteweise Einlesen, kann man auch größere Blöcke einlesen, muß dann aber immer nachfragen, wieviel tatsächlich gelesen wurde.