public static void compress(String srcFilePath, String destFilePath) {
File src = new File(srcFilePath);
if (!src.exists()) {
throw new RuntimeException(srcFilePath + "不存在");
File zipFile = new File(destFilePath);
try {
FileOutputStream fos = new FileOutputStream(zipFile);
CheckedOutputStream cos = new CheckedOutputStream(fos, new CRC32());
ZipOutputStream zos = new ZipOutputStream(cos);
String baseDir = "";
compressbyType(src, zos, baseDir);
zos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
private static void compressbyType(File src, ZipOutputStream zos, String baseDir) {
if (!src.exists())
return;
System.out.println("压缩" + baseDir + src.getName());
if (src.isFile()) {
compressFile(src, zos, baseDir);
} else if (src.isDirectory()) {
compressDir(src, zos, baseDir);
* 压缩文件
private static void compressFile(File file, ZipOutputStream zos, String baseDir) {
if (!file.exists())
return;
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
ZipEntry entry = new ZipEntry(baseDir + file.getName());
zos.putNextEntry(entry);
int count;
byte[] buf = new byte[8019];
while ((count = bis.read(buf)) != -1) {
zos.write(buf, 0, count);
bis.close();
} catch (Exception e) {
// TODO: handle exception
* 压缩文件夹
private static void compressDir(File dir, ZipOutputStream zos, String baseDir) {
if (!dir.exists())
return;
File[] files = dir.listFiles();
if(files.length == 0){
try {
zos.putNextEntry(new ZipEntry(baseDir + dir.getName() + File.separator));
} catch (IOException e) {
e.printStackTrace();
for (File file : files) {
compressbyType(file, zos, baseDir + dir.getName() + File.separator);
* 解压文件/文件夹
public static void decompress(String srcPath, String dest) throws Exception {
File file = new File(srcPath);
if (!file.exists()) {
throw new RuntimeException(srcPath + "所指文件不存在");
ZipFile zf = new ZipFile(file);
Enumeration entries = zf.entries();
ZipEntry entry = null;
while (entries.hasMoreElements()) {
entry = (ZipEntry) entries.nextElement();
System.out.println("解压" + entry.getName());
if (entry.isDirectory()) {
String dirPath = dest + File.separator + entry.getName();
File dir = new File(dirPath);
dir.mkdirs();
} else {
// 表示文件
File f = new File(dest + File.separator + entry.getName());
if (!f.exists()) {
//String dirs = FileUtils.getParentPath(f);
String dirs = f.getParent();
File parentDir = new File(dirs);
parentDir.mkdirs();
f.createNewFile();
// 将压缩文件内容写入到这个文件中
InputStream is = zf.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(f);
int count;
byte[] buf = new byte[8192];
while ((count = is.read(buf)) != -1) {
fos.write(buf, 0, count);
is.close();
fos.close();
@RequestMapping("zip")
public void testzip() {
ZipUtils.compress("F:\\test","F:\\test.zip");
///解压
try {
ZipUtils.decompress("F:\\test.zip","F:\\as");
} catch (Exception e) {
e.printStackTrace();
System.out.println("解压文件夹失败");
Java编程思想中提到:压缩文件的时候,ZipOutputStream调用putNextEntry方法,并传入一个ZipEntry参数;解压文件的时候,new一个ZipFile对象并调用其entries()方法,对该方法返回的枚举类进行遍历并作为参数传给ZipFile的getInputStream方法。

不用引入外部包工具类ZipUtils:import java.io.*;import java.util.Enumeration;import java.util.zip.*;public class ZipUtils { /** * 压缩文件/文件夹 * */ public static void compress(String srcFilePath, String destFilePath) { File src = n
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
2.当多个文件放在一个文件夹中压缩的时候,解压的时候有...
主要实现解压压缩包,拿到压缩包中每个文件。
针对压缩包的操作,首先需要拿到压缩包文件的流,然后利用第三方工具将流实例化,调用next方法迭代,然后分别操作压缩包中的单个文件。
三、代码实现
1.zip实现
jdk支持对zip流的操作,相关依赖在java.util.zip下
// 获取本地zip包
public void unzipByPath() {
try {
String localPath = "D:\\文件.zip";
File file
[code=java]
ClassLoader classLoader=new ClassLoader() {};
Class c=classLoader.loadClass("com.test.hello");
Method[] methods = c.getMethods();
for(Method method : methods){
System.out.println(method.getName());
[/code]
上面使用了java.lang.reflect.Method的getName方法,但是我这里写的这个类并没有被初始化
Java解压zip文件(支持对文件夹解压/压缩)
X.J.T:
Java解压zip文件(支持对文件夹解压/压缩)
m0_60183459: