package com.gome.budget.common.utils;

import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
import org.apache.commons.compress.archivers.zip.Zip64Mode;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream; import java.io.*;
import java.util.ArrayList;
import java.util.List; public class CompressUtil { /**
* 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()) {
return;
}
InputStream is = null;
// ZipArchiveInputStream zais = null;
ArchiveInputStream input = null;
try {
is = new FileInputStream(file);
String archiverName = file.getName().substring(file.getName().lastIndexOf(".") + 1, file.getName().length()); input = new ArchiveStreamFactory()
.createArchiveInputStream(archiverName, is); // zais = new ZipArchiveInputStream(is, "");
ArchiveEntry archiveEntry = null;
while ((archiveEntry = input.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 = input.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 (input != null) {
input.close();
}
if (is != null) {
is.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
} public static void main(String[] args) {
// zip压缩
String dir = "D:\\share\\java";
String zippath = "D:\\share\\test.zip";
CompressUtil.zip(dir, zippath);
} }

java 压缩包的更多相关文章

  1. java压缩包上传,解压,预览(利用editor.md和Jstree实现)和下载

    java压缩包上传,解压,预览(利用editor.md和Jstree实现)和下载 实现功能:zip文件上传,后台自动解压,Jstree树目录(遍历文件),editor.md预览 采用Spring+Sp ...

  2. Java压缩包解压到指定文件

    在获得一个以Zip格式压缩的文件之后,需要将其进行解压缩,还原成压缩前的文件.若是使用Java自带的压缩工具包来实现解压缩文件到指定文件夹的功能,因为jdk提供的zip只能按UTF-8格式处理,而Wi ...

  3. Java压缩包(zip)【学习笔记】

    前言 Java实现Zip压缩解压可以使用JDK的原生类java.util.zip,但是JDK 7 之前存在中文文件名乱码问题. 使用 ant.jar 的org.apache.tools.zip包,可以 ...

  4. Java Hour 11

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为11 Hour,请各位不吝赐教. Hour 11 ...

  5. [第二届构建之法论坛] 预培训文档(Java版)

    本博客是第二届构建之法论坛暨软件工程培训活动预培训文档中[适用于结对编程部分的Java版本],需要实验者有一部分Java基础. 目录 Part0.背景 Part1.配置环境 配置JDK Linux 平 ...

  6. 3、Linux下配置Java环境

    转载:http://blog.sina.com.cn/s/blog_c5a35e780102wtxl.html 生物信息很多软件都是用java写的,所以需要在linux上配置java运行环境.平台上的 ...

  7. linux系统安装java

    1.下载Java压缩包 *.gz 2.解压 3.修改Linux配置文件,配置Java环境变量 4.使用命令source /etc/profile让修改生效 转载 https://www.cnblogs ...

  8. install hadoop on xubuntu

    0. install xubuntu we recommend to set username as "hadoop" after installation, set user & ...

  9. Linux(centeros)下安装jdk

    首先需要说明的是有的Linux系统自带jdk,这个jdk是openjdk,可以通过java-version查看 所以安装的步骤是,首先删除系统自带的(如果有)openjdk 1. rpm -qa | ...

随机推荐

  1. Django中的HttpResponse和JsonResponse

    Django中的HttpResponse和JsonResponse 我们在编写一些借口函数的时候,经常需要给调用者返回json格式的数据,那么如何返回可直接解析的数据呢? 首先第一种方式: from ...

  2. c++ 11新特性学习1

    static_assert 静态断言,特点是编译期的断言检查 assert 运行时期的断言检查 二者参数用法相同

  3. C#中ORM的简单实现

    ORM在功能上主要有两个: 把从数据库中查询返回的DataSet,DataTable转化为我们可以方便使用的实体类集合: 把要对数据库操作的实体类集合或条件转化为数据库可以直接执行的SQL语句.

  4. Jmeter---参数化之用户参数

    总结: 参数化几次就要设置几个线程,执行的时候,是按顺序执行,下面的请求也会跟着请求

  5. python接口自动化(get请求)

    python接口自动化(get请求) get请求的目的:查询资源 一.导包 二.请求的URL 三.请求的参数 四.获取请求的URL 五.获取响应的状态码 六.获取响应的本文信息 #导包 import ...

  6. COGS2356 【HZOI2015】有标号的DAG计数 IV

    题面 题目描述 给定一正整数n,对n个点有标号的有向无环图进行计数. 这里加一个限制:此图必须是弱连通图. 输出答案mod 998244353的结果 输入格式 一个正整数n. 输出格式 一个数,表示答 ...

  7. Erlang学习记录:转义

    转义 转义序列 含义 整数编码 \b 退格符 8 \d 删除符 127 \e 换码符 27 \f 换页符 12 \n 换行符 10 \r 回车符 13 \s 空格符 32 \t 制表符 9 \v 垂直 ...

  8. CSS——滑动门技术及应用

    先来体会下现实中的滑动门,或者你可以叫做推拉门: 滑动门出现的背景 制作网页时,为了美观,常常需要为网页元素设置特殊形状的背景,比如微信导航栏,有凸起和凹下去的感觉,最大的问题是里面的字数不一样多,咋 ...

  9. 单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件)

    单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件) 单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件) webrtc的音频处理模块分为降噪ns,回音消除aec,回声 ...

  10. 模拟MySQL命令

    staff_table 1,Alex Li,22,13651054608,IT,2013-04-01 2,Jack Wang,30,13304320533,HR,2015-05-03 3,Rain L ...