今天我們將研究Java壓縮檔案的範例。我們還將使用Java程式壓縮資料夾並創建壓縮檔案。
Java ZIP
java.util.zip.ZipOutputStream
可以用來將檔案壓縮成ZIP格式。由於ZIP檔案可以包含多個條目,ZipOutputStream使用java.util.zip.ZipEntry
來表示ZIP檔案條目。
Java ZIP 檔案
創建單個檔案的ZIP壓縮檔案非常簡單,我們需要從目標檔案的FileOutputStream物件創建一個ZipOutputStream物件。然後,我們將一個新的ZipEntry添加到ZipOutputStream中,並使用FileInputStream從源檔案讀取到ZipOutputStream物件中。寫入完成後,我們需要關閉ZipEntry並釋放所有資源。
Java Zip 資料夾
壓縮目錄有點複雜,首先我們需要獲取文件列表的絕對路徑。然後分別處理每個文件。我們需要為每個文件添加一個ZipEntry,並使用FileInputStream來讀取源文件的內容,並將其寫入對應的ZipEntry。
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);
//現在逐個壓縮文件
//創建ZipOutputStream來寫入zip文件
FileOutputStream fos = new FileOutputStream(zipDirName);
ZipOutputStream zos = new ZipOutputStream(fos);
for(String filePath : filesListInDir){
System.out.println("Zipping "+filePath);
//對於ZipEntry,我們需要保留相對文件路徑,因此我們在絕對路徑上使用了substring
ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
zos.putNextEntry(ze);
//讀取文件並寫入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 {
//創建ZipOutputStream來寫入zip文件
FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos);
//向ZipOutputStream添加新的Zip Entry
ZipEntry ze = new ZipEntry(file.getName());
zos.putNextEntry(ze);
//讀取文件並寫入ZipOutputStream
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
//關閉zip entry以寫入zip文件
zos.closeEntry();
//關閉資源
zos.close();
fis.close();
fos.close();
System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述Java壓縮示例程序的輸出是:
/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條目時,我使用的是從目錄中的相對路徑,這樣當我們解壓縮時,它將創建相同的目錄結構。這就是Java壓縮示例的全部。
Source:
https://www.digitalocean.com/community/tutorials/java-zip-file-folder-example