Java实现的zip压缩及解压缩工具类示例

网友投稿 428 2023-02-27


Java实现的zip压缩及解压缩工具类示例

本文实例讲述了java实现的zip压缩及解压缩工具类。分享给大家供大家参考,具体如下:

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.Enumeration;

import org.apache.tools.zip.ZipEntry;

import org.apache.tools.zip.ZipFile;

import org.apache.tools.zip.ZipOutputStream;

public class ZipUtil {

private static final int BUFFEREDSIZE = 1024;

/**

* 压缩文件

*

* @param zipFileName

* 保存的压缩包文件路径

* @param filePath

* 需要压缩的文件夹或者文件路径

* @param isDelete

* 是否删除源文件

* @throws Exception

*/

public void zip(String zipFileName, String filePath, boolean isDelete) throws Exception {

zip(zipFileName, new File(filePath), isDelete);

}

/**

* 压缩文件

*

* @param zipFileName

* 保存的压缩包文件路径

* @param inputFile

* 需要压缩的文件夹或者文件

* @param isDelete

* 是否删除源文件

* @throws Exception

*/

public void zip(String zipFileName, File inputFile, boolean isDelete) throws Exception {

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));

if (!inputFile.exists()) {

throw new FileNotFoundException("在指定路径未找到需要压缩的文件!");

}

zip(ourQyHtIont, inputFile, "", isDelete);

out.close();

}

/**

* 递归压缩方法

*

* @param out

* 压缩包输出流

* @param f

* 需要压缩的文件

* @param base

* 压缩的路径

* @param isDelete

* 是否删除源文件

* @throws Exception

*/

private void zip(ZipOutputStream out, File inputFile, String base, boolean isDelete) throws Exception {

if (inputFile.isDirectory()) { // 如果是目录

File[] inputFiles = inputFile.listFiles();

out.putNextEntry(new ZipEntry(base + "/"));

base = base.length() == 0 ? "" : base + "/";

for (int i = 0; i < inputFiles.length; i++) {

zip(out, inputFiles[i], base + inputFiles[i].getName(), isDelete);

}

} else { // 如果是文件

if (base.length() > 0) {

out.putNextEntry(new ZipEntry(base));

} erQyHtIonlse {

out.putNextEntry(new ZipEntry(inputFile.getName()));

}

FileInputStream in = new FileInputStream(inputFile);

try {

int len;

byte[] buff = new byte[BUFFEREDSIZE];

while ((len = in.read(buff)) != -1) {

out.write(buff, 0, len);

}

} catch (IOException e) {

throw e;

} finally {

in.close();

}

}

if (isDelete) {

inputFile.delete();

}

}

/**

* 解压缩

*

* @param zipFilePath

* 压缩包路径

* @param fileSavePath

* 解压路径

* @param isDelete

* 是否删除源文件

* @throws Exception

*/

public void unZip(String zipFilePath, String fileSavePath, boolean isDelete) throws Exception {

try {

(new File(fileSavePath)).mkdirs();

File f = new File(zipFilePath);

if ((!f.exists()) && (f.length() <= 0)) {

throw new Exception("要解压的文件不存在!");

}

ZipFile zipFile = new ZipFile(f);

String strPath, gbkPath, strtemp;

File tempFile = new File(fileSavePath);// 从当前目录开始

strPath = tempFile.getAbsolutePath();// 输出的绝对位置

Enumeration e = zipFile.getEntries();

while (e.hasMoreElements()) {

org.apache.tools.zip.ZipEntry zipEnt = e.nextElement();

gbkPath = zipEnt.getName();

if (zipEnt.isDirectory()) {

strtemp = strPath + File.separator + gbkPath;

File dir = new File(strtemp);

dir.mkdirs();

continue;

} else {

// 读写文件

InputStream is = zipFile.getInputStream(zipEnt);

BufferedInputStream bis = new BufferedInputStream(is);

gbkPath = zipEnt.getName();

strtemp = strPath + File.separator + gbkPath;

// 建目录

String strsubdir = gbkPath;

for (int i = 0; i < strsubdir.length(); i++) {

if (strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {

String temp = strPath + File.separator + strsubdir.substring(0, i);

File subdir = new File(temp);

if (!subdir.exists())

subdir.mkdir();

}

}

FileOutputStream fos = new FileOutputStream(strtemp);

BufferedOutputStream bos = new BufferedOutputStream(fos);

int len;

byte[] buff = new byte[BUFFEREDSIZE];

while ((len = bis.read(buff)) != -1) {

bos.write(buff, 0, len);

}

bos.close();

fos.close();

}

}

} catch (Exception e) {

e.printStackTrace();

throw e;

}

if (isDelete) {

new File(zipFilePath).delete();

}

}

// public static void main(String[] args) {

// ZipUtil cpr = new ZipUtil();

// try {

// cpr.zip("C:/Users/Lenovo User/Desktop/test中文.zip", "C:/Users/Lenovo User/Desktop/新建文件夹", false);

// cpr.unZip("C:/Users/Lenovo User/Desktop/test中文.zip", "C:/Users/Lenovo User/Desktop/新建文件夹2", false);rQyHtIon

// } catch (Exception e) {

// e.printStackTrace();

// }

//

// }

}

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring Boot 项目中使用Swagger2的示例
下一篇:Layui前后台交互数据获取java实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~