Wie kann man mit Java eine Datei zippen?

Ein ZipOutputStream kann ein Zip-Archiv erzeugen und stellt Methoden zu dessen Behandlung bereit.

Das Beispiel komprimiert eine Datei und speichert sie in einem ZIP-Archiv. Hierzu wird zunächst das Archiv selbst durch Aufruf des Konstruktors der Klasse ZipOutputStream aufgerufen, dem ein Objekt eines FileOutputStream als Parameter übergeben wird. Diesem muss seinerseits der Pfad des Zip-Archivs übergeben werden. Existiert das Archiv, so wird es überschrieben, im anderen Fall wird es neu erstellt.
Nach dem Erzeugen eines InputStreams zum Lesen der zu komprimierenden Datei, wird dem Archiv durch die Methode putNextEntry() ein neuer Eintrag hinzugefügt. Der Eintrag besteht aus einem Objekt vom Typ ZipEntry. Dem Objekt kann bei Bedarf eine Größe, ein Kommentar, ein Modifizierungszeitpunkt oder eine Komprimierungsmethode durch entsprechende Setter-Methoden übergeben werden. Wird keine Komprimierungsmethode spezifiziert, so wird diejenige des ZipOutputStream verwendet, der in der Standardeinstellung eine Komprimierung vornimmt. Er besitzt wie ZipEntry ebenfalls eine Methode setMethod(), mit der diese Eigenschaft eingestellt werden kann.

Als nächstes wird ein Array deklariert, in das der Inhalt der zu speichernden Datei nacheinander eingelesen wird. Dies geschieht durch die Methode read() des FileInputStream innerhalb einer Schleife. Sie gibt die Größe der gelesenen Byte zurück und liest so lange, wie weiterer Inhalt gelesen werden kann. Am Ende wird 0 zurück gegeben.
Der Vorgang wird durch Schließen des Eintrags und der beiden Ströme abgeschlossen.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class DateiZippen {

    public static void main(String[] args) {
        zipFile("/Users/joecze/Desktop/test.log", "/Users/joecze/Desktop/test.zip");
    }
    
    private static void zipFile(String inFileName, String outFileName){
        ZipOutputStream zos = null;
        FileInputStream fis = null;
        try {
            zos = new ZipOutputStream(
                    new FileOutputStream(outFileName));
            fis = new FileInputStream(inFileName);
            zos.putNextEntry(new ZipEntry(new File(inFileName).getName()));
            int len;
            byte[] buffer = new byte[2048];
            while ((len = fis.read(buffer, 0, buffer.length)) > 0) {
                zos.write(buffer, 0, len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(fis != null){
                try {
                    fis.close();
                } catch (IOException e) {}
            }
            if(zos != null){
                try {
                    zos.closeEntry();
                    zos.close();
                } catch (IOException e) {}
            }
        }
    }
}