Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


10.6.3

Komprimierung im Deflate-Format



Die Komprimierung im Deflate-Format kann entweder in Datenblöcken oder über Streams erfolgen. Für die blockweise Komprimierung bzw. Dekomprimierung werden die Klassen Deflater bzw. Inflater verwendet. Bei der Verwendung von Streams benötigt man die Klassen DeflaterOutputStream bzw. InflatorInputStream. Die Streams greifen allerdings intern auf die blockweise Datenkomprimierung zurück. Der Aufbau des Deflate-Formats kann in RFC 1951 nachgelesen werden.

Komprimierung im Block

Die Komprimierung von Daten im Deflate-Format erfolgt mit der Klasse Deflater. Es kann sowohl die Strategie, nach der die Komprimierung stattfinden soll, als auch die Komprimierungsstärke eingestellt werden. Der Ablauf bei der Komprimierung ist folgender: In folgendem Code-Auszug wird ein Block Daten mit Hilfe der Klasse Deflater komprimiert. Die Daten liegen bereits in dem Array data vor. Die komprimierten Daten sind anschließend in dem Array buffer enthalten:
  byte buffer[] = new byte[1024];
  Deflater def = new Deflater();
  def.setStrategie(Deflater.DEFLATED);
  def.setLevel(Deflater.BEST_COMPRESSION);
  def.setInput(data);
  def.finish();
  def.deflate(buffer);
Für die Strategie und die Komprimierungsstärke sind in der Klasse Deflater Konstanten definiert. Als Wert für die Komprimierungstärke ist aber auch jeder Wert zwischen 0 und 9 zulässig. Die Konstanten können im Einzelnen in der Referenz nachgeschlagen werden.

Zur Dekomprimierung der Daten wird die Klasse Inflater benötigt. Sie läuft eigentlich analog zur Komprimierung der Daten mit der Klasse Deflater ab: In folgendem Code-Ausschnitt werden die oben genannten Schritte durchgeführt:
  byte data[] = new byte[1024];
  Inflater inf = new Inflater();
  def.setInput(buffer);
  def.inflate(data);
Die komprimierten Daten befinden sich in diesem Fall zu Beginn im Array buffer. Die dekomprimierten Daten können danach im Array data abgerufen werden.

Die Arrays, die den Methoden deflate() bzw. inflate() übergeben werden, müssen beim Aufruf bereits initialisiert sein. deflate() und inflate() liefern als Ergebnis jeweils die Anzahl der Bytes zurück, die in das übergebene Array geschrieben wurde.

Die Klassen Deflater und Inflater können z. B. verwendet werden, um eine On-the-fly-Komprimierung bei der Datenübertragung über Sockets vorzunehmen. Bei einem Schreibvorgang in einen Socket werden die Daten so lange zwischengepuffert, bis ein Block einer bestimmten Länge erreicht ist. Dann werden die Daten komprimiert und anschließend als Ganzes übertragen. Auf der Gegenseite muss der Block entsprechend dekomprimiert werden.

Die Implementierung von Sockets, die eine solche Funktionalität bereit stellen ist in Abschnitt 13.2.5 zu finden.

Komprimierung mit Streams

Die Verwendung der Klassen DeflaterOutputStream und InflaterInputStream erfolgt analog zu den Streams, die Komprimierung im GZIP-Format ermöglichen. Wenn man GZIPOutputStream und GZIPInputStream im Abschnitt 10.6.1 durch DeflaterOutputStream und InflaterInputStream ersetzt, werden die Daten im Deflate-Format gespeichert.

Ein Unterschied besteht allerdings in der Initialisierung der Streams. Bei der Erzeugung eines DeflaterOutputStreams bzw. InflaterInputStreams kann zusätzlich ein Deflater- bzw. Inflater-Objekt und eine Puffergröße übergeben werden.

Eine Intialisierung könnte z. B. sein:
 DeflaterOutputStream def = 
   new DeflaterOutputStream(new FileOutputStream("test.def"));
Es wäre aber auch folgende Initialierung denkbar:
 DeflaterOutputStream def; 
 def = new DeflaterOutputStream(
   new FileOutputStream("test.def"), new Deflater(), 512);


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.