zoukankan      html  css  js  c++  java
  • 【压缩文件】文件压缩工具

    文件与文件夹压缩工具:

    package zip;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    /**
     * zip压缩工具类
     */
    public class ZipUtils {
        /**
         * 压缩文件夹
         * @param srcFolder
         * @param destZipFile
         * @throws Exception
         */
        public static void zipFolder(String srcFolder, String destZipFile) throws Exception {
            ZipOutputStream zip = null;
            FileOutputStream fileWriter = null;
    
            fileWriter = new FileOutputStream(destZipFile);
            zip = new ZipOutputStream(fileWriter);
    
            addFolderToZip("", srcFolder, zip);
            zip.flush();
            zip.close();
        }
    
        /**
         * 压缩文件
         * @param filePath
         * @param zipPath
         * @throws Exception
         */
        public static void zipFile(String filePath, String zipPath) throws Exception{
            byte[] buffer = new byte[1024];
            FileOutputStream fos = new FileOutputStream(zipPath);
            ZipOutputStream zos = new ZipOutputStream(fos);
            ZipEntry ze= new ZipEntry("spy.log");
            zos.putNextEntry(ze);
            FileInputStream in = new FileInputStream(filePath);
            int len;
            while ((len = in.read(buffer)) > 0) {
                zos.write(buffer, 0, len);
            }
            in.close();
            zos.closeEntry();
            //remember close it
            zos.close();
        }
    
        /**
         * 添加文件到zip
         * @param path
         * @param srcFile
         * @param zip
         * @throws Exception
         */
        public static void addFileToZip(String path, String srcFile, ZipOutputStream zip)
                throws Exception {
    
            File folder = new File(srcFile);
            if (folder.isDirectory()) {
                addFolderToZip(path, srcFile, zip);
            } else {
                byte[] buf = new byte[1024];
                int len;
                FileInputStream in = new FileInputStream(srcFile);
                zip.putNextEntry(new ZipEntry(path + "/" + folder.getName()));
                while ((len = in.read(buf)) > 0) {
                    zip.write(buf, 0, len);
                }
            }
        }
    
        /**
         * 添加文件夹到zip
         * @param path
         * @param srcFolder
         * @param zip
         * @throws Exception
         */
        public static void addFolderToZip(String path, String srcFolder, ZipOutputStream zip) throws Exception {
            File folder = new File(srcFolder);
            if (null != path && folder.isDirectory()) {
                for (String fileName : folder.list()) {
                    if (path.equals("")) {
                        addFileToZip(folder.getName(), srcFolder + "/" + fileName, zip);
                    } else {
                        addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, zip);
                    }
                }
            }
        }
    
    } 

    单个文件压缩与解压工具:

    代码转载地址:https://blog.csdn.net/kiwi0933/article/details/77834758

    package zip;
    
    import java.io.*;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    import java.util.zip.ZipOutputStream;
    
    /**
     * Zip压缩/解压缩工具类
     * 实现对目标路径及其子路径下的所有文件及空目录的压缩
     * 参考网上若干种实现,并修改其bug
     * https://blog.csdn.net/kiwi0933/article/details/77834758
     * @version        v0.1, 17/09/04
     */
    public class ZipUtil {
    
        /** 缓冲器大小 */
        private static final int BUFFER = 512;
    
        /**
         * 取的给定源目录下的所有文件及空的子目录
         * 递归实现
         *
         * @param srcFile
         *
         * @return
         */
        private static List<File> getAllFiles(File srcFile) {
            List<File> fileList = new ArrayList<File>();
            File[]     tmp      = srcFile.listFiles();
    
            for (int i = 0; i < tmp.length; i++) {
    
                if (tmp[i].isFile()) {
                    fileList.add(tmp[i]);
                    System.out.println("add file: "+tmp[i].getName());
                }
    
                if (tmp[i].isDirectory()) {
                    if (tmp[i].listFiles().length!=0){//若不是空目录,则递归添加其下的目录和文件
                        fileList.addAll(getAllFiles(tmp[i]));
                    }
                    else{//若是空目录,则添加这个目录到fileList
                        fileList.add(tmp[i]);
                        System.out.println("add empty dir: "+tmp[i].getName());
                    }
                }
            }    // end for
    
            return fileList;
        }
    
        /**
         * 取相对路径
         * 依据文件名和压缩源路径得到文件在压缩源路径下的相对路径
         *
         * @param dirPath 压缩源路径
         * @param file
         *
         * @return 相对路径
         */
        private static String getRelativePath(String dirPath, File file) {
            File   dir          = new File(dirPath);
            String relativePath = file.getName();
    
            while (true) {
                file = file.getParentFile();
    
                if (file == null) {
                    break;
                }
    
                if (file.equals(dir)) {
                    break;
                } else {
                    relativePath = file.getName() + "/" + relativePath;
                }
            }    // end while
    
            return relativePath;
        }
    
        /**
         * 创建文件
         * 根据压缩包内文件名和解压缩目的路径,创建解压缩目标文件,
         * 生成中间目录
         * @param dstPath 解压缩目的路径
         * @param fileName 压缩包内文件名
         *
         * @return 解压缩目标文件
         *
         * @throws IOException
         */
        private static File createFile(String dstPath, String fileName) throws IOException {
            String[] dirs = fileName.split("/");//将文件名的各级目录分解
            File     file = new File(dstPath);
    
            if (dirs.length > 1) {//文件有上级目录
                for (int i = 0; i < dirs.length - 1; i++) {
                    file = new File(file, dirs[i]);//依次创建文件对象知道文件的上一级目录
                }
    
                if (!file.exists()) {
                    file.mkdirs();//文件对应目录若不存在,则创建
                    System.out.println("mkdirs: " + file.getCanonicalPath());
                }
    
                file = new File(file, dirs[dirs.length - 1]);//创建文件
    
                return file;
            } else {
                if (!file.exists()) {
                    file.mkdirs();//若目标路径的目录不存在,则创建
                    System.out.println("mkdirs: " + file.getCanonicalPath());
                }
    
                file = new File(file, dirs[0]);//创建文件
    
                return file;
            }
        }
        public static void main(String[] args) {
            try {
                zip("/Users/zhangxu/aaa","/Users/zhangxu/");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /**
         * 解压缩方法
         *
         *
         * @param zipFileName 压缩文件名
         * @param dstPath 解压目标路径
         *
         * @return
         */
        public static boolean unzip(String zipFileName, String dstPath) {
            System.out.println("zip uncompressing...");
    
            try {
                ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFileName));
                ZipEntry       zipEntry       = null;
                byte[]         buffer         = new byte[BUFFER];//缓冲器
                int            readLength     = 0;//每次读出来的长度
    
                while ((zipEntry = zipInputStream.getNextEntry()) != null) {
                    if (zipEntry.isDirectory()) {//若是zip条目目录,则需创建这个目录
                        File dir = new File(dstPath + "/" + zipEntry.getName());
    
                        if (!dir.exists()) {
                            dir.mkdirs();
                            System.out.println("mkdirs: " + dir.getCanonicalPath());
    
                            continue;//跳出
                        }
                    }
    
                    File file = createFile(dstPath, zipEntry.getName());//若是文件,则需创建该文件
    
                    System.out.println("file created: " + file.getCanonicalPath());
    
                    OutputStream outputStream = new FileOutputStream(file);
    
                    while ((readLength = zipInputStream.read(buffer, 0, BUFFER)) != -1) {
                        outputStream.write(buffer, 0, readLength);
                    }
    
                    outputStream.close();
                    System.out.println("file uncompressed: " + file.getCanonicalPath());
                }    // end while
            } catch (FileNotFoundException e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
                System.out.println("unzip fail!");
    
                return false;
            } catch (IOException e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
                System.out.println("unzip fail!");
    
                return false;
            }
    
            System.out.println("unzip success!");
    
            return true;
        }
    
        /**
         * 压缩方法
         * (可以压缩空的子目录)
         * @param srcPath 压缩源路径
         * @param zipFileName 目标压缩文件
         *
         * @return
         */
        public static boolean zip(String srcPath, String zipFileName) {
            System.out.println("zip compressing...");
    
            File       srcFile    = new File(srcPath);
            List<File> fileList   = getAllFiles(srcFile);//所有要压缩的文件
            byte[]     buffer     = new byte[BUFFER];//缓冲器
            ZipEntry   zipEntry   = null;
            int        readLength = 0;//每次读出来的长度
    
            try {
                ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFileName));
    
                for (File file : fileList) {
                    if (file.isFile()){//若是文件,则压缩这个文件
                        zipEntry = new ZipEntry(getRelativePath(srcPath, file));
                        zipEntry.setSize(file.length());
                        zipEntry.setTime(file.lastModified());
                        zipOutputStream.putNextEntry(zipEntry);
    
                        InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
    
                        while ((readLength = inputStream.read(buffer, 0, BUFFER)) != -1) {
                            zipOutputStream.write(buffer, 0, readLength);
                        }
    
                        inputStream.close();
                        System.out.println("file compressed: " + file.getCanonicalPath());
                    }else {//若是目录(即空目录)则将这个目录写入zip条目
                        zipEntry = new ZipEntry(getRelativePath(srcPath, file)+"/");
                        zipOutputStream.putNextEntry(zipEntry);
                        System.out.println("dir compressed: " + file.getCanonicalPath()+"/");
                    }
    
                }    // end for
    
                zipOutputStream.close();
            } catch (FileNotFoundException e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
                System.out.println("zip fail!");
    
                return false;
            } catch (IOException e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
                System.out.println("zip fail!");
    
                return false;
            }
    
            System.out.println("zip success!");
    
            return true;
        }
    }
    
    
    
  • 相关阅读:
    证书介绍
    Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
    Hive安装与配置详解
    技术学习内容
    死锁,更新锁,共享锁,排它锁,意向锁,乐观锁,悲观锁等名词解释及案例详解
    死锁语句
    SQL Server 锁表、查询被锁表、解锁相关语句
    Psi Probe 安装及使用说明
    PowerDesigner使用教程
    Python -面向对象(一 基本概念)
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054068.html
Copyright © 2011-2022 走看看