apache.commons.compress zip压缩解压工具类完整版(使用递归支持无限文件夹的解压缩)
来源:互联网 发布:三洋air9s性能数据 编辑:程序博客网 时间:2024/04/30 09:27
压缩解压工具类完整版(使用递归支持无限文件夹的解压缩)
网上一致没有找到可以完全无限文件夹的解压缩,并支持中文的zip工具类,所以自己写了一个在这里分享一下。
说明:jdk自带的zip中文会乱码,所以这里采用的是apache 的compress
注意:需要导入jar :commons-compress-1.9.jar
<pre name="code" class="java">package test;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import org.apache.commons.compress.archivers.ArchiveEntry;import org.apache.commons.compress.archivers.zip.Zip64Mode;import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;public class ZipUtil {public static void main(String[] args) {String dir = "D:\\workspace\\runtime-com.qz.meta.product\\xxxx\\.image";String zippath = "D:\\test2.zip";ZipUtil.zip(dir, zippath); String unzipdir = "D:\\test2";String unzipfile = "D:\\test2.zip";ZipUtil.unzip(unzipfile, unzipdir);System.out.println("success!");} /** * zip压缩文件 * @param dir * @param zippath */public static void zip(String dir ,String zippath){List<String> paths = getFiles(dir); compressFilesZip(paths.toArray(new String[paths.size()]),zippath,dir);}/** * 递归取到当前目录所有文件 * @param dir * @return */public static List<String> getFiles(String dir){List<String> lstFiles = null;if(lstFiles == null){lstFiles = new ArrayList<String>();}File file = new File(dir);File [] files = file.listFiles(); for(File f : files){if(f.isDirectory()){lstFiles.add(f.getAbsolutePath());lstFiles.addAll(getFiles(f.getAbsolutePath()));}else{ String str =f.getAbsolutePath();lstFiles.add(str);}}return lstFiles;}/** * 文件名处理 * @param dir * @param path * @return */public static String getFilePathName(String dir,String path){String p = path.replace(dir+File.separator, "");p = p.replace("\\", "/");return p;} /** * 把文件压缩成zip格式 * @param files 需要压缩的文件 * @param zipFilePath 压缩后的zip文件路径 ,如"D:/test/aa.zip"; */ public static void compressFilesZip(String[] files,String zipFilePath,String dir) { if(files == null || files.length <= 0) { return ; } ZipArchiveOutputStream zaos = null; try { File zipFile = new File(zipFilePath); zaos = new ZipArchiveOutputStream(zipFile); zaos.setUseZip64(Zip64Mode.AsNeeded); //将每个文件用ZipArchiveEntry封装 //再用ZipArchiveOutputStream写到压缩文件中 for(String strfile : files) { File file = new File(strfile); if(file != null) { String name = getFilePathName(dir,strfile); ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(file,name); zaos.putArchiveEntry(zipArchiveEntry); if(file.isDirectory()){ continue; } InputStream is = null; try { is = new BufferedInputStream(new FileInputStream(file)); byte[] buffer = new byte[1024 ]; int len = -1; while((len = is.read(buffer)) != -1) { //把缓冲区的字节写入到ZipArchiveEntry zaos.write(buffer, 0, len); } zaos.closeArchiveEntry(); }catch(Exception e) { throw new RuntimeException(e); }finally { if(is != null) is.close(); } } } zaos.finish(); }catch(Exception e){ throw new RuntimeException(e); }finally { try { if(zaos != null) { zaos.close(); } } catch (IOException e) { throw new RuntimeException(e); } } } /** * 把zip文件解压到指定的文件夹 * @param zipFilePath zip文件路径, 如 "D:/test/aa.zip" * @param saveFileDir 解压后的文件存放路径, 如"D:/test/" () */public static void unzip(String zipFilePath, String saveFileDir) {if(!saveFileDir.endsWith("\\") && !saveFileDir.endsWith("/") ){saveFileDir += File.separator;}File dir = new File(saveFileDir);if(!dir.exists()){dir.mkdirs();}File file = new File(zipFilePath);if (file.exists()) {InputStream is = null; ZipArchiveInputStream zais = null;try {is = new FileInputStream(file);zais = new ZipArchiveInputStream(is);ArchiveEntry archiveEntry = null;while ((archiveEntry = zais.getNextEntry()) != null) { // 获取文件名String entryFileName = archiveEntry.getName();// 构造解压出来的文件存放路径String entryFilePath = saveFileDir + entryFileName;OutputStream os = null;try {// 把解压出来的文件写到指定路径File entryFile = new File(entryFilePath);if(entryFileName.endsWith("/")){entryFile.mkdirs();}else{os = new BufferedOutputStream(new FileOutputStream(entryFile));byte[] buffer = new byte[1024 ]; int len = -1; while((len = zais.read(buffer)) != -1) { os.write(buffer, 0, len); }}} catch (IOException e) {throw new IOException(e);} finally {if (os != null) {os.flush();os.close();}}} } catch (Exception e) {throw new RuntimeException(e);} finally {try {if (zais != null) {zais.close();}if (is != null) {is.close();}} catch (IOException e) {throw new RuntimeException(e);}}}}}
0 0
- apache.commons.compress zip压缩解压工具类完整版(使用递归支持无限文件夹的解压缩)
- Apache Commons Compress 压缩zip
- Java 使用Apache commons-compress 解压zip文件
- 使用commons-compress.jar压缩ZIP文件
- 使用Apache Commons jar进行解压缩-zip解压zip-jar解压jar
- Java压缩类库的使用-4.Apache commons compress中的打包、压缩类库
- 使用commons-compress操作zip文件(压缩和解压缩)
- 支持递归压缩文件夹-org.apache.tools.zip.ZipEntry
- Apache commons-compress ZIP打包
- Linux下的zip压缩解压缩文件夹
- Apache commons compress中的打包、压缩类库
- java使用Apache的ant压缩和解压文件(zip)
- ZIP解压缩文件的工具类【支持多级目录|全】
- 使用org.apache.tools.zip实现zip压缩和解压
- 使用org.apache.tools.zip实现zip压缩和解压
- 使用org.apache.tools.zip实现zip压缩和解压
- 使用org.apache.tools.zip实现zip压缩和解压
- 使用org.apache.tools.zip实现zip压缩和解压
- LeetCode : No4 Median of Two Sorted Arrays
- 【牛腩】——新闻发布系统收工
- android:为TextView添加样式——下划线,颜色,设置链接样式及前背景色
- 深度探索I/O完成端口
- 【基础html5 基础知识点】(全)
- apache.commons.compress zip压缩解压工具类完整版(使用递归支持无限文件夹的解压缩)
- 开源项目学习:Android-Universal-Image-Loader-Part1
- 网页刷新技术理论知识简单总结
- Mysql设计时该不该加约束
- Monitor类:Object synchronization method was called from an unsynchronized block of code.
- 解决了为什么按了Tab键为什么不会出现html:5的格式
- 修改feedback接收邮件的邮箱
- zoj 2921 Stock(贪心)
- 利用forwardInvocation和First Responder在xcode联接未定义的Action