Artikel

 
Oktober 2009 | Artikel

Commons Compress

(Link zum Artikel: http://www.it-republik.de/jaxenter/artikel/2640)

Eine Open-Source-Perle

Text: Christian Grobmeier
Apache Commons ist ein Projekt, das sich der Entwicklung von kleinen, aber feinen Komponenten verschrieben hat. Commons neuester Sprößling – Compress – ist seit Ende Mai in seiner ersten Version 1.0 erschienen.

Compress hat eine recht lange Geschichte hinter sich – ursprünglich kam der Original-Code vom mysteriösen Apache-Avalon-Excalibur-Projekt, das wiederum den Code von Ant hatte. Im Anschluss haben die Entwickler von Commons IO die Wartung übernommen und den Code kurze Zeit später in seine eigene Komponente gesteckt: in Commons Compress. Nicht zu vergessen, dass natürlich einiges an Code auch über Public Domain Packages oder andere Apache-lizensierte Projekte hinzugenommen wurden. Ende 2005 wurde ein weiterer Versuch unternommen, Compress zur Produktreife zu bringen, doch erst 2008 fanden sich genügend Committer zusammen, um ein notwendiges Redesign vorzunehmen. Herausgekommen ist ein streaming-basiertes API zum Verarbeiten von verschiedensten Dateitypen: AR, CPIO, TAR, ZIP, GZIP und BZIP2 stehen im Programm.

Installation und Konfiguration

Compress ist via üblicher Maven Repositories oder via Download verfügbar. Das gilt für alle Commons-Komponenten und sollte keine Überraschung darstellen. Weitere Abhängigkeiten sind nicht notwendig. Maven-Benutzer verwenden also:

  1. <dependency>
  2. <groupId>org.apache.commons</groupId>
  3. <artifactId>commons-compress</artifactId>
  4. <version>1.0</version>
  5. <scope>compile</scope>
  6. </dependency>

Compress wurde für Java 1.4 oder später geschrieben.

Die Idee

Compress unterscheidet zwischen ArchiverStream- und CompressorStream-Klassen. Archiver sind Archivformate, die von selbst keinen Komprimierungsalgorithmus anbieten. Beispiele sind TAR oder CPIO. Ein Compressor beschreibt dagegen eine Datei, die komprimiert ist – beispielsweise GZ (Gunzip) oder BZ2 (Bunzip). Eine große Ausnahme bildet das beliebte ZIP Format – es ermöglicht Komprimierung und Archivierung gleichermaßen. Nachdem Archiver im Allgemeinen mehr Funktionalität aufweisen, wurde ZIP daher auch als Archiver aufgenommen.

Factory

Um mit einem TAR-Archiv zu arbeiten, muss ein entsprechend passendes ArchiverStream-Objekt erzeugt werden. Ähnlich funktioniert es übrigens bei den Compressoren. Die Instanziierung erledigt eine Factory – für ArchiverStreams die ArchiverStreamFactory. Sie benötigt dazu den Typ des zu erzeugenden Archivers und das Archiv als Stream. Alternativ kann die Factory über den Stream selbst erkennen, um welches Archiv es sich handelt.

  1. ArchiveInputStream input = new ArchiveStreamFactory() .createArchiveInputStream(in);

Das obige Beispiel zeigt, wie anhand eines InputStreams erkannt wird, um welchen Archive-Typ es sich handelt. Dieser Stream wird mit ArchiveInputStream ummantelt. Damit stehen nun spezielle Funktionen zum Auslesen des Archives bereit. Das Objekt in bezeichnet hier übrigens einen BufferedInputStream: Das automatische Erkennen des Eingabetyps erfordert einen Stream, der Kennzeichnungen (= Mark) unterstützt. Hat man einmal den korrekten InputStream erzeugt, kann über dessen Inhalte einfach iteriert werden:

  1. ArchiveEntry entry = null;
  2. while ((entry = input.getNextEntry()) != null) {
  3. File target = new File(dir, entry.getName());
  4. final OutputStream out = new FileOutputStream(target);
  5. IOUtils.copy(in, out);
  6. out.close();
  7. result.put(entry.getName(), target);
  8. }

Natürlich müssen dann noch die entsprechenden Streams geschlossen werden – fertig. Auf diese Art und Weise funktioniert das Entspacken mit allen Archivern. Es bleibt nur noch zu erwähnen, dass die meisten täglichen Dinge mit der Standard Factory erreicht werden können. Reicht diese Abstraktion einmal nicht mehr aus, kann jedoch auf die spezialisierteren Klassen zurückgegriffen werden. Selbstverständlich stehen auch Funktionalitäten zum Erstellen oder Modifizieren von Archiven bereit – wer einmal versucht hat, Einträge aus einer ZIP-Datei zu löschen, weiß solche Hilfen sicherlich zu schätzen.

Christian Grobmeier arbeitet als Entwickler und Projektleiter mit Schwerpunkt auf Java und J(2)EE bei der AraCom Software GmbH in Augsburg,. Er ist Committer bei der Apache Software Foundation für log4php and für Commons. In seiner Freizeit schreibt er Fachbücher und -artikel. Sie erreichen ihn unter grobmeier@gmail.com.
  1. http://commons.apache.org/compress

andere Artikel dieser Serie


Anzeige

Kommentare


Anzeige

zurück zum Seitenanfang