Heute werden wir uns ein Beispiel für eine Java-Zip-Datei ansehen. Wir werden auch einen Ordner komprimieren und eine Zip-Datei mit einem Java-Programm erstellen.
Java ZIP
java.util.zip.ZipOutputStream
kann verwendet werden, um eine Datei im ZIP-Format zu komprimieren. Da eine Zip-Datei mehrere Einträge enthalten kann, verwendet ZipOutputStream java.util.zip.ZipEntry
, um einen Zip-Dateieintrag darzustellen.
Java ZIP-Datei
Das Erstellen eines Zip-Archivs für eine einzelne Datei ist sehr einfach. Wir müssen ein ZipOutputStream-Objekt aus dem FileOutputStream-Objekt der Zieldatei erstellen. Dann fügen wir dem ZipOutputStream einen neuen ZipEntry hinzu und verwenden FileInputStream, um die Quelldatei in das ZipOutputStream-Objekt zu lesen. Sobald wir mit dem Schreiben fertig sind, müssen wir ZipEntry schließen und alle Ressourcen freigeben.
Java-Zip-Ordner
Zipping ein Verzeichnis ist etwas knifflig. Zuerst müssen wir die Dateiliste als absoluten Pfad erhalten. Verarbeite dann jede Datei separat. Wir müssen für jede Datei einen ZipEntry hinzufügen und FileInputStream verwenden, um den Inhalt der Quelldatei zum ZipEntry für diese Datei zu lesen.
Java Zip Beispiel
Hier ist das Java-Programm, das zeigt, wie man eine einzelne Datei zippt oder einen Ordner in Java zippt.
package com.journaldev.files;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFiles {
List filesListInDir = new ArrayList();
public static void main(String[] args) {
File file = new File("/Users/pankaj/sitemap.xml");
String zipFileName = "/Users/pankaj/sitemap.zip";
File dir = new File("/Users/pankaj/tmp");
String zipDirName = "/Users/pankaj/tmp.zip";
zipSingleFile(file, zipFileName);
ZipFiles zipFiles = new ZipFiles();
zipFiles.zipDirectory(dir, zipDirName);
}
/**
* This method zips the directory
* @param dir
* @param zipDirName
*/
private void zipDirectory(File dir, String zipDirName) {
try {
populateFilesList(dir);
// jetzt Dateien nacheinander zippen
// erstelle ZipOutputStream zum Schreiben in die Zip-Datei
FileOutputStream fos = new FileOutputStream(zipDirName);
ZipOutputStream zos = new ZipOutputStream(fos);
for(String filePath : filesListInDir){
System.out.println("Zipping "+filePath);
// für ZipEntry müssen wir nur den relativen Dateipfad behalten, daher haben wir Substring auf dem absoluten Pfad verwendet
ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
zos.putNextEntry(ze);
// lese die Datei und schreibe in ZipOutputStream
FileInputStream fis = new FileInputStream(filePath);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
zos.closeEntry();
fis.close();
}
zos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* This method populates all the files in a directory to a List
* @param dir
* @throws IOException
*/
private void populateFilesList(File dir) throws IOException {
File[] files = dir.listFiles();
for(File file : files){
if(file.isFile()) filesListInDir.add(file.getAbsolutePath());
else populateFilesList(file);
}
}
/**
* This method compresses the single file to zip format
* @param file
* @param zipFileName
*/
private static void zipSingleFile(File file, String zipFileName) {
try {
// erstelle ZipOutputStream zum Schreiben in die Zip-Datei
FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos);
// füge dem ZipOutputStream einen neuen Zip Entry hinzu
ZipEntry ze = new ZipEntry(file.getName());
zos.putNextEntry(ze);
// lese die Datei und schreibe in ZipOutputStream
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
// Schließe den Zip-Eintrag, um in die Zip-Datei zu schreiben
zos.closeEntry();
// Schließe Ressourcen
zos.close();
fis.close();
fos.close();
System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Die Ausgabe des obigen Java-Zip-Beispielprogramms ist:
/Users/pankaj/sitemap.xml is zipped to /Users/pankaj/sitemap.zip
Zipping /Users/pankaj/tmp/.DS_Store
Zipping /Users/pankaj/tmp/data/data.dat
Zipping /Users/pankaj/tmp/data/data.xml
Zipping /Users/pankaj/tmp/data/xmls/project.xml
Zipping /Users/pankaj/tmp/data/xmls/web.xml
Zipping /Users/pankaj/tmp/data.Xml
Zipping /Users/pankaj/tmp/DB.xml
Zipping /Users/pankaj/tmp/item.XML
Zipping /Users/pankaj/tmp/item.xsd
Zipping /Users/pankaj/tmp/ms/data.txt
Zipping /Users/pankaj/tmp/ms/project.doc
Beachte, dass beim Protokollieren von Dateien zum Zippen im Verzeichnis der absolute Pfad gedruckt wird. Beim Hinzufügen des Zip-Eintrags verwende ich jedoch den relativen Pfad vom Verzeichnis, damit beim Entzippen die gleiche Verzeichnisstruktur erstellt wird. Das ist alles für das Java-Zip-Beispiel.
Source:
https://www.digitalocean.com/community/tutorials/java-zip-file-folder-example