Автор оригинала: Pankaj Kumar.
Сегодня мы рассмотрим пример zip-файла java. Мы также сжмем папку и создадим zip-файл с помощью программы java.
ПОЧТОВЫЙ ИНДЕКС Java
java.util.zip.ZipOutputStream может использоваться для сжатия файла в формат ZIP. Поскольку zip-файл может содержать несколько записей, ZipOutputStream использует java.util.zip.ZipEntry для представления записи в zip-файле.
ZIP-файл Java
Создать zip-архив для одного файла очень просто, нам нужно создать объект ZipOutputStream из объекта FileOutputStream целевого файла. Затем мы добавляем новый ZipEntry в ZipOutputStream и используем FileInputStream для чтения исходного файла в объект ZipOutputStream. Как только мы закончим писать, нам нужно закрыть ZipEntry и освободить все ресурсы.
Zip-папка Java
Сжать каталог немного сложнее, сначала нам нужно получить список файлов в виде абсолютного пути. Затем обработайте каждый из них отдельно. Нам нужно добавить ZipEntry для каждого файла и использовать FileInputStream для чтения содержимого исходного файла в ZipEntry, соответствующий этому файлу.
Пример Zip на Java
Вот программа java, показывающая, как заархивировать один файл или заархивировать папку на java.
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);
//now zip files one by one
//create ZipOutputStream to write to the zip file
FileOutputStream fos = new FileOutputStream(zipDirName);
ZipOutputStream zos = new ZipOutputStream(fos);
for(String filePath : filesListInDir){
System.out.println("Zipping "+filePath);
//for ZipEntry we need to keep only relative file path, so we used substring on absolute path
ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
zos.putNextEntry(ze);
//read the file and write to 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 {
//create ZipOutputStream to write to the zip file
FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos);
//add a new Zip Entry to the ZipOutputStream
ZipEntry ze = new ZipEntry(file.getName());
zos.putNextEntry(ze);
//read the file and write to ZipOutputStream
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
//Close the zip entry to write to zip file
zos.closeEntry();
//Close resources
zos.close();
fis.close();
fos.close();
System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Вывод приведенного выше примера программы java zip является:
/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
Обратите внимание, что при записи файлов в zip-каталог я печатаю абсолютный путь. Но при добавлении записи zip я использую относительный путь из каталога, чтобы, когда мы распакуем его, он создал ту же структуру каталогов. Это все для примера zip Java.