Java.util.zip 提供用於讀寫標准 ZIP 和 GZIP 文件格式的類。
還包括使用 DEFLATE 壓縮算法(用於 ZIP 和 GZIP 文件格式)對數據進行壓縮和解壓縮的類。
依賴 Jdk 編寫該工具類,不依賴任何第三方 jar,隨用隨取,實現功能大體如下:
1.目錄級別遞歸壓縮與解壓縮 zip;
2.單文件壓縮和解壓縮 zip ;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/**
* 通過Java的Zip輸入輸出流實現壓縮和解壓文件
*/
public final class ZipUtil {
private ZipUtil() {
}
/**
* 壓縮文件
*
* @param filePath 待壓縮的文件路徑
* @return 壓縮後的文件
*/
public static File zip(String filePath) {
File target = null;
File source = new File(filePath);
if (source.exists()) {
String sourceName = source.getName();
String zipName = sourceName.contains(".") ? sourceName.substring(0, sourceName.indexOf(".")) : sourceName;
target = new File(source.getParent(), zipName + ".rar");
if (target.exists()) {
boolean delete = target.delete();//刪除舊的壓縮包
}
FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
fos = new FileOutputStream(target);
zos = new ZipOutputStream(new BufferedOutputStream(fos));
addEntry(null, source, zos); //添加對應的文件Entry
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
IOUtil.closeQuietly(zos, fos);
}
}
return target;
}
/**
* 掃描添加文件Entry
*
* @param base 基路徑
* @param source 源文件
* @param zos Zip文件輸出流
* @throws IOException
*/
private static void addEntry(String base, File source, ZipOutputStream zos) throws IOException {
String entry = (base != null) ? base + source.getName() : source.getName(); //按目錄分級,形如:aaa/bbb.txt
if (source.isDirectory()) {
File[] files = source.listFiles();
if (files != null && files.length > 0) {
for (File file : files) {
addEntry(entry + "/", file, zos);// 遞歸列出目錄下的所有文件,添加文件 Entry
}
}
} else {
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
byte[] buffer = new byte[1024 * 10];
fis = new FileInputStream(source);
bis = new BufferedInputStream(fis, buffer.length);
int read;
zos.putNextEntry(new ZipEntry(entry)); //如果只是想將文件夾下的所有文件壓縮,不需名要壓縮父目錄,約定文件名長度 entry.substring(length)
while ((read = bis.read(buffer, 0, buffer.length)) != -1) {
zos.write(buffer, 0, read);
}
zos.closeEntry();
} finally {
IOUtil.closeQuietly(bis, fis);
}
}
}
/**
* 解壓文件
*
* @param filePath 壓縮文件路徑
*/
public static void unzip(String filePath) {
File source = new File(filePath);
if (source.exists()) {
ZipInputStream zis = null;
BufferedOutputStream bos = null;
try {
zis = new ZipInputStream(new FileInputStream(source));
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) {
File target = new File(source.getParent(), entry.getName());
if (!target.getParentFile().exists()) {
target.getParentFile().mkdirs();
}
bos = new BufferedOutputStream(new FileOutputStream(target));
int read;
byte[] buffer = new byte[1024 * 10];
while ((read = zis.read(buffer, 0, buffer.length)) != -1) {
bos.write(buffer, 0, read);
}
bos.flush();
}
zis.closeEntry();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
IOUtil.closeQuietly(zis, bos);
}
}
}
}
輸入輸出 工具類IOUtil :
import java.io.Closeable;
import java.io.IOException;
/**
* IO流工具類
*/
public class IOUtil {
/**
* 關閉一個或多個流對象
* @param closeables 可關閉的流對象列表
* @throws IOException
*/
public static void close(Closeable... closeables) throws IOException {
if (closeables != null) {
for (Closeable closeable : closeables) {
if (closeable != null) {
closeable.close();
}
}
}
}
/**
* 關閉一個或多個流對象
*/
public static void closeQuietly(Closeable... closeables) {
try {
close(closeables);
} catch (IOException e) {
// do nothing
}
}
}