添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

最近整了一个压缩文件的工具类,功能:

  1. 压缩文件夹,也可以压缩单独的文件
  2. 压缩空文件夹(额..)
  3. 目录结构是否保留可选
  4. 压缩复杂文件夹(文件夹中带有文件夹)
  5. 不保留目录结构时重命名同名文件
import java.io.*;
import java.util.HashMap;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
 * @author 落尘
public class ZipUtils {
    private static HashMap<Object, Object> index = new HashMap<>();
    private static int count = 0;
    public static void main(String[] args) {
        try {
            File file = zip("zipfile.zip", new File("C:\\TEMP\\doc"),false);
            System.out.println(file.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
     * 压缩目标文件/夹, 存放于相同目录下(同级)
     * @param compressedFileName 压缩后的文件名
     * @param filePath 需要压缩的文件路径
     * @param keepStructure 是否保留目录结构
     * @return 压缩后的文件对象
     * @throws IOException 压缩异常
    public static File zip(String compressedFileName,String filePath,boolean keepStructure) throws IOException {
        return zip(compressedFileName,new File(filePath),keepStructure);
     * 压缩目标文件/夹, 存放于相同目录下(同级)
     * @param compressedFileName 压缩后的文件名
     * @param file 需要压缩的文件
     * @param keepStructure 是否保留目录结构
     * @return 压缩后的文件对象
     * @throws IOException 压缩异常
    public static File zip(String compressedFileName,File file,boolean keepStructure) throws IOException {
        if (file == null || !file.exists()){
            return null;
        if (isEmpty(compressedFileName)){
            compressedFileName = file.getName();
        // 维护一个目录
        if (keepStructure){
            count = 0;
            index = new HashMap<>(10);
        // 定义压缩文件名称
        File zipFile = new File(file.getParentFile().getAbsolutePath() + File.separator + compressedFileName);
        // 压缩流对象
        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
        // 文件直接压缩,文件夹递归压缩
        if (!file.isDirectory()){
            addCompressedFile(zipOut,null,file);
        }else {
            addCompressedFloder(zipOut,null,file,keepStructure);
        zipOut.close();
        System.out.println("压缩完成");
        return zipFile;
     * 压缩文件夹
     * @param zipOut 压缩流
     * @param parentPath 压缩文件路径
     * @param file 文件夹
     * @param keepStructure 是否保留目录结构
    private static void addCompressedFloder(ZipOutputStream zipOut,String parentPath,File file,boolean keepStructure) throws IOException {
        if (file == null || !file.exists()) {
            return;
        parentPath = empty(parentPath);
        if (!file.isDirectory()){
            if (keepStructure){
                addCompressedFile(zipOut,parentPath,file);
            }else{
                addCompressedFile(zipOut,null,file);
        }else{
            System.out.println("读取目标文件夹"+file.getName());
            File[] files = file.listFiles();
            assert files != null;
            // 生成空文件夹
            if (keepStructure) {
                zipOut.putNextEntry(new ZipEntry(parentPath + file.getName() + File.separator));
            for (File openFile: files) {
                addCompressedFloder(zipOut,parentPath + file.getName() + File.separator,openFile,keepStructure);
     * 压缩文件
     * @param zipOut 压缩流
     * @param parentPath 压缩文件目录
     * @param file 文件夹
     * @throws IOException
   private static void addCompressedFile(ZipOutputStream zipOut,String parentPath,File file) throws IOException {
       InputStream input = new FileInputStream(file);
       String fileName = file.getName();
       System.out.print("压缩目标文件"+fileName);
       if (parentPath != null){
           System.out.println(" 目录:" + parentPath + fileName);
           zipOut.putNextEntry(new ZipEntry(parentPath + fileName));
       } else {
           System.out.println(" 目录:" + fileName);
           if (index.containsKey(fileName)){
               count ++;
               zipOut.putNextEntry(new ZipEntry("(" + count + ")" + fileName));
               index.put("(" + count + ")" + fileName,true);
           } else {
               zipOut.putNextEntry(new ZipEntry(fileName));
               index.put(fileName,true);
       int temp;
       while((temp=input.read())!=-1){
           zipOut.write(temp);
       zipOut.closeEntry();
       input.close();
    private static String empty(String s){
        if (isEmpty(s)){
            return "";
        return s;
    private static boolean isEmpty(String str) {
        return str == null || "".equals(str.trim());
 

压缩单个文件

压缩文件夹 

  1. 保留目录结构          
  2.  不保留目录结构

 压缩复杂文件夹

简单的测试...

 压缩复杂文件夹不保留目录结构时同名文件的处理

对于同名文件处理是在前面加个数字,保留目录结构时:

这边是维护了一个hashmap作为目录保证文件名的唯一,有更好的做法欢迎评论留言一起讨论

1、打开一个或者多个*.class文件,XJad反编译后,重命名为*.java文件, 保存至当前文件夹,并在编辑器中打开查看; 2、打开一个文件夹,XJad将该文件夹下所有*.class文件进行反编译,并保存至该文件夹下, 依据包路径信息生成文件夹路径,如com.spring.framework.*, 将建立com\spring\framework的文件夹结构; 3、打开一个*.jar文件,XJad将该Jar文件中的所有*.class文件解压缩到临时目录并进行反编译, 并将源文件带包路径信息保存至当前文件夹下名称为“~” + *.jar 的文件夹中; 当你需要修改一些文件的名称时,可以参考该文章。 例如:在你利用收集表等方法收集的图片时(此时文件的名称是包括提交者的姓名的),你需要将收集的图片的名称修改成统一的格式(例如:姓名+学号 等等)。 ======== 1、XJad是基于Jad核心的Java源程序反编译软件,内置Jad1.5.8e2; 2、可处理多个*.class文件,可以处理文件夹内的所有文件,甚至可以处理*.jar文件; 3、带有多页面文本编辑器,也可集成在资源管理器中,随时点击右键都可进行操作; 4、支持java语法的高亮显示; 使用说明: ======== 1、打开一个或者多个*.class文件,XJad反编译后,重命名为*.java文件, 保存至当前文件夹,并在编辑器中打开查看; 2、打开一个文件夹,XJad将该文件夹下所有*.class文件进行反编译,并保存至该文件夹下, 依据包路径信息生成文件夹路径,如com.spring.framework.*, 将建立com\spring\framework的文件夹结构; 3、打开一个*.jar文件,XJad将该Jar文件中的所有*.class文件解压缩到临时目录并进行反编译, 并将源文件带包路径信息保存至当前文件夹下名称为“~” + *.jar 的文件夹中; <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency> import org.apache.commons.lang3.StringUtils; import org.slf public static void zipFile(String filePath) { Log.e("开始压缩文件", System.currentTimeMillis() + ""); Stri. db 里边存了一堆允许重名的文档,需要导出,且自动给重名的文档叠加数字尾缀。比如有文档名字分别是【全国富婆通讯录】、【全国富婆通讯录】、【全国富婆通讯录(1)】... java.util.zip.ZipException: duplicate entry import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; * 文件操作 * Created by heavenick on 2015/7/8. public class FileUtil... 23 final File file = newFile(targetFilePath);4 if (!file.exists()) {5 file.mkdirs();6 }7 RandomAccessFile randomAccessFile = null;8 IInArchive inArchive = null;910 ... * @return net.ourway.cf3.CallResult @RequestMapping(value = "/toPendingTopicZip", method = RequestMethod.GET, produces =