程序实现了ZIP压缩。共分为2部分 : 压缩(compression)与解压(decompression)
大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。
需在代码中自定义源输入路径和目标输出路径。
package com.uaes.util;
import java.io.*;
import java.util.zip.*;
/**
* @description 实现了ZIP【压缩】【解压】功能:大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。
* @author King_wangyao
* @date 2011-11-28
* @version 1.0.0
*
*/
public class ZIPUtil {
private static int k = 1; // 定义递归次数变量
/**
* 指定ZIP压缩(compression)
*
* @param zipFileName 输入完整的压缩包路径名称
* @param inputFile 输入将要压缩的目录
*/
private static void compression(String zipFileName, File inputFile) throws Exception {
long startTime = System.currentTimeMillis();
System.out.println("压缩中...");
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
BufferedOutputStream bo = new BufferedOutputStream(out);
zip(out, inputFile, "/" + inputFile.getName(), bo);
bo.close();
out.close(); // 输出流关闭
System.out.println("压缩完成");
long endTime = System.currentTimeMillis();
System.out.println("压缩耗费时间: " + (endTime - startTime) + " ms");
}
private static void zip(ZipOutputStream out, File f, String base, BufferedOutputStream bo) throws Exception { // 方法重载
if (f.isDirectory()) {
File[] fl = f.listFiles();
for (int i = 0; i < fl.length; i++) {
zip(out, fl[i], base + "/" + fl[i].getName(), bo); // 递归遍历子文件夹
}
System.out.println("第" + k + "次递归");
k++;
} else {
out.putNextEntry(new ZipEntry(base)); // 创建zip压缩进入点base
System.out.println(base);
FileInputStream in = new FileInputStream(f);
BufferedInputStream bi = new BufferedInputStream(in);
int b;
while ((b = bi.read()) != -1) {
bo.write(b); // 将字节流写入当前zip目录
}
bi.close();
in.close(); // 输入流关闭
}
}
/**
* 指定ZIP解压(decompression)
*
* @param target 输入源zip路径
* @param parent 输出解压目录)
*/
public static void decompression(String target, String parent) {
long startTime = System.currentTimeMillis();
System.out.println("压缩中...");
try {
ZipInputStream Zin = new ZipInputStream(new FileInputStream(target));// 输入源zip路径
BufferedInputStream Bin = new BufferedInputStream(Zin);
File Fout = null;
ZipEntry entry;
try {
while ((entry = Zin.getNextEntry()) != null && !entry.isDirectory()) {
Fout = new File(parent, entry.getName());
if (!Fout.exists()) {
(new File(Fout.getParent())).mkdirs();
}
FileOutputStream out = new FileOutputStream(Fout);
BufferedOutputStream Bout = new BufferedOutputStream(out);
int b;
while ((b = Bin.read()) != -1) {
Bout.write(b);
}
Bout.close();
out.close();
System.out.println(Fout + "解压成功");
}
Bin.close();
Zin.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("解压耗费时间: " + (endTime - startTime) + " ms");
}
/**
* 测试...
* @param args
*/
public static void main(String[] args) {
// 自定义的zip输出路径
String target = "C:\\TEMP\\Compression.zip";
// 自定义的源输入路径,即要压缩的文件或文件夹
String path = "C:\\TEMP\\student.png";
// 自定义的解压目录
String decompressionPath = "C:\\TEMP\\decompression";
try {
// 压缩测试
compression(target, new File(path));
// 解压测试
decompression(target, decompressionPath);
} catch (Exception e) {
e.printStackTrace();
}
}
}
程序控制台输入结果,如下图:
压缩、解压结果,如下图: