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
Wichtige Konstruktoren |
GZIPOutputStream(OutputStream out) |
Creates a new output stream with a default buffer size. |
Wichtige Methoden |
Returntyp | Name der Methode |
void |
write(byte[] buf, int off, int len)
Writes array of bytes to the compressed output stream. |
Wichtige Konstruktoren |
GZIPInputStream(InputStream in) |
Creates a new input stream with a default buffer size. |
Wichtige Methoden |
Returntyp | Name der Methode |
int |
read(byte[] buf, int off, int len)
Reads uncompressed data into an array of bytes. |
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)
{
}
}
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.