Vandaag zullen we kijken naar een voorbeeld van een Java-zipbestand. We zullen ook een map comprimeren en een zipbestand maken met behulp van een Java-programma.
Java ZIP
java.util.zip.ZipOutputStream
kan worden gebruikt om een bestand te comprimeren naar ZIP-formaat. Aangezien een zipbestand meerdere items kan bevatten, gebruikt ZipOutputStream java.util.zip.ZipEntry
om een zipbestandsitem voor te stellen.
Java ZIP-bestand
Het maken van een ziparchief voor een enkel bestand is erg eenvoudig. We moeten een ZipOutputStream-object maken vanuit het FileOutputStream-object van het doelbestand. Vervolgens voegen we een nieuwe ZipEntry toe aan de ZipOutputStream en gebruiken we FileInputStream om het bronbestand naar het ZipOutputStream-object te lezen. Zodra we klaar zijn met schrijven, moeten we ZipEntry sluiten en alle bronnen vrijgeven.
Java Zip-map
Zipping een map is een beetje lastig, eerst moeten we de lijst met bestanden als absolute pad krijgen. Verwerk ze vervolgens elk afzonderlijk. We moeten een ZipEntry toevoegen voor elk bestand en FileInputStream gebruiken om de inhoud van het bronbestand naar de overeenkomstige ZipEntry te lezen.
Java Zip Voorbeeld
Hier is het Java-programma dat laat zien hoe je een enkel bestand kunt zippen of een map in Java kunt zippen.
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);
//zip nu bestanden één voor één
//maak ZipOutputStream aan om naar het zipbestand te schrijven
FileOutputStream fos = new FileOutputStream(zipDirName);
ZipOutputStream zos = new ZipOutputStream(fos);
for(String filePath : filesListInDir){
System.out.println("Zipping "+filePath);
//voor ZipEntry moeten we alleen het relatieve bestandspad bewaren, dus gebruikten we substring op absoluut pad
ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
zos.putNextEntry(ze);
//lees het bestand en schrijf naar 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 {
//maak ZipOutputStream aan om naar het zipbestand te schrijven
FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos);
//voeg een nieuwe Zip Entry toe aan de ZipOutputStream
ZipEntry ze = new ZipEntry(file.getName());
zos.putNextEntry(ze);
//lees het bestand en schrijf naar ZipOutputStream
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
//Sluit de zip-entry om naar het zipbestand te schrijven
zos.closeEntry();
//Sluit bronnen
zos.close();
fis.close();
fos.close();
System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
De uitvoer van het bovenstaande Java-zipvoorbeeldprogramma is:
/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
Merk op dat bij het vastleggen van bestanden in een map, ik het absolute pad afdruk. Maar bij het toevoegen van een zip-entry gebruik ik het relatieve pad vanuit de map, zodat wanneer we het uitpakken, het dezelfde mappenstructuur zal creëren. Dat is alles voor het Java-zipvoorbeeld.
Source:
https://www.digitalocean.com/community/tutorials/java-zip-file-folder-example