使用java.util.zip包實現文件壓縮
ZipOutputStream
public ZipOutputStream(OutputStream out)
構造函數,創建zip輸出流public void putNextEntry(ZipEntry e)
設置每一個ZipEntry對象,即設置壓縮元素名稱(文件名)public void setComment(String comment)
設置文件註釋public void write(byte b[])
寫入zip文件內容
Example 1 壓縮單文件
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @author: dkangel
* @since: 2019/11/21 21:04
* @Description: 壓縮單個文件
*/
public class ZipSingleFile {
public static void main(String[] args) throws Exception {
// 原始文件
String sourcePath = "D:/zip_test/test.txt";
File sourceFile = new File(sourcePath);
// zip文件名(包含文件路徑)
String targetPath = "D:/zip_test/test.zip";
File targetFile = new File(targetPath);
// 原始文件數據讀入流
InputStream input = new FileInputStream(sourceFile);
// zip文件輸出流
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(targetFile));
// 定義壓縮文件內容文件名
String contentFileName = "content.docx";
zipOut.putNextEntry(new ZipEntry(contentFileName));
zipOut.setComment("hello world.");
// 寫入數據
int temp;
while ((temp = input.read()) != -1) {
zipOut.write(temp);
}
input.close();
zipOut.close();
}
}
測試結果:
壓縮前:
壓縮後:
結論:壓縮單文件成功,壓縮後文件內容不變,可以自定義zip文件名、內容文件名等。
Example 2 壓縮文件夾(多文件壓縮)
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @author: dkangel
* @since: 2019/11/21 21:32
* @Description:
*/
public class ZipMultipleFile {
public static void main(String[] args) throws IOException {
// 需要壓縮文件夾路徑
String sourcePath = "D:/zip_test/tmp";
File sourceFile = new File(sourcePath);
// zip文件輸出路徑
String targetPath = "D:/zip_test/zip_test.zip";
File targetFile = new File(targetPath);
// 定義zip輸出流,用於將輸入流內容寫入zip文件
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(targetFile));
// 壓縮文件
zipFile(sourceFile, zipOut);
zipOut.close();
}
/**
* 壓縮文件
*
* @param sourceFile 原始文件
* @param zipOutputStream 壓縮流
* @throws IOException
*/
private static void zipFile(File sourceFile, ZipOutputStream zipOutputStream) throws IOException {
// 文件夾,則遞歸遍歷
if (sourceFile.isDirectory()) {
File[] files = sourceFile.listFiles();
if (files == null) {
return;
}
for (File subFile : files) {
zipFile(subFile, zipOutputStream);
}
}
// 文件,寫入文件
if (sourceFile.isFile()) {
// 獲取父路徑
String regx = "tmp";
int index = sourceFile.getPath().indexOf(regx);
String fileName = sourceFile.getPath().substring(index + regx.length() + 1);
zipOutputStream.putNextEntry(new ZipEntry(fileName));
// 寫入數據
int temp;
InputStream inputStream = new FileInputStream(sourceFile);
while ((temp = inputStream.read()) != -1) {
zipOutputStream.write(temp);
}
inputStream.close();
}
}
}
測試結果:
壓縮前:
壓縮後:
結論:文件夾壓縮成功,壓縮後文件內容不變,可以自定義zip文件名、內容文件名等。