首页 > 其他分享 >文件的压缩与解压缩

文件的压缩与解压缩

时间:2023-11-25 19:33:35浏览次数:23  
标签:文件 String zip 压缩 sourceFile 解压缩 zos File new

Java中提供了ZipOutputStream和GZIPOutputStream类供文件压缩使用。

import java.io.*;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public final class ZipUtil {

    private ZipUtil() {
    }

    /**
     * 压缩文件成zip
     *
     * @param srcDir           压缩文件夹路径
     * @param targetDir        压缩后文件的路径名称
     * @param KeepDirStructure 是否保留原来的目录结构
     * @throws RuntimeException
     */
    public static void toZip(String srcDir, String targetDir, boolean KeepDirStructure) throws RuntimeException {
        File sourceFile = new File(srcDir);
        String sourcePath = sourceFile.getParentFile().toString();
        String fileName = sourceFile.getName();
        ZipOutputStream zos = null;
        try {
            FileOutputStream out = null;
            if (targetDir != null && !"".equals(targetDir)) {
                if (sourceFile.isDirectory()) {
                    out = new FileOutputStream(new File(sourcePath + "/" + fileName + ".zip"));
                } else {
                    out = new FileOutputStream(new File(sourcePath + "/" + fileName.substring(0, fileName.lastIndexOf('.')) + ".zip"));
                }
            } else {
                out = new FileOutputStream(new File(targetDir));
            }
            zos = new ZipOutputStream(out);
            compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure);
        } catch (Exception e) {
            throw new RuntimeException("压缩失败!", e);
        } finally {
            if (zos != null) {
                try {
                    zos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 解压zip文件
     *
     * @param srcFile 待解压的zip文件
     * @param descDir 解压后的存放路径
     * @throws IOException
     **/
    public static void unZipFiles(String srcFile, String descDir) throws IOException {

        File descDirFile = new File(descDir);
        if (!descDirFile.exists()) {
            descDirFile.mkdirs();
        }
        ZipFile zipFile = new ZipFile(srcFile, Charset.forName("GBK"));
        for (Enumeration entries = zipFile.entries(); entries.hasMoreElements(); ) {
            ZipEntry entry = (ZipEntry) entries.nextElement();
            String zipEntryName = entry.getName();
            String outPath = (descDir + "/" + zipEntryName).replaceAll("\\*", "/");
            File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
            if (!file.exists()) {
                file.mkdirs();
            }
            if (new File(outPath).isDirectory()) {
                continue;
            }
            try (InputStream in = zipFile.getInputStream(entry);
                 OutputStream out = new FileOutputStream(outPath)) {
                byte[] buf1 = new byte[1024];
                int len;
                while ((len = in.read(buf1)) > 0) {
                    out.write(buf1, 0, len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        zipFile.close();
    }

    private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean isDir) throws Exception {
        byte[] buf = new byte[2 * 1024];
        if (sourceFile.isFile()) {
            zos.putNextEntry(new ZipEntry(name));
            int len;
            FileInputStream in = new FileInputStream(sourceFile);
            while ((len = in.read(buf)) != -1) {
                zos.write(buf, 0, len);
            }
            zos.closeEntry();
            in.close();
        } else {
            File[] listFiles = sourceFile.listFiles();
            if (listFiles == null || listFiles.length == 0) {
                if (isDir) {
                    zos.putNextEntry(new ZipEntry(name + "/"));
                    zos.closeEntry();
                }

            } else {
                for (File file : listFiles) {
                    if (isDir) {
                        compress(file, zos, name + "/" + file.getName(), isDir);
                    } else {
                        compress(file, zos, file.getName(), isDir);
                    }
                }
            }
        }
    }
}

 

标签:文件,String,zip,压缩,sourceFile,解压缩,zos,File,new
From: https://www.cnblogs.com/xfeiyun/p/17855845.html

相关文章

  • 无涯教程-Linux - 文件管理
    在本章中,我们将详细讨论Unix中的文件管理,Unix中的所有数据都是文件,所有文件都组织在目录中,这些目录被组织成称为文件系统的树状结构。在Unix中,文件有三种基本类型-OrdinaryFiles  -普通文件是系统上包含数据,文本或程序指令的文件。Directories     -目录存储......
  • 公众号怎么上传PDF文件
    微信公众号在信息传播领域的影响力日益增强。然而,公众号并不直接支持PDF文件上传,这让许多需要分享长篇文档和报告的作者感到困惑。不过,好消息是,有一些第三方工具,如“微附件”,可以帮助我们轻松地实现这一目的。下面,我们将详细介绍如何利用“微附件”在公众号上上传PDF文件。1.注册/......
  • linux 中du命令指定以不同的单位显示文件的大小
     001、(base)[root@pc1test]#ls(base)[root@pc1test]#ddif=/dev/zeroof=a.txtcount=30bs=1M##生成一个测试文件30+0recordsin30+0recordsout31457280bytes(31MB)copied,0.0231627s,1.4GB/s(base)[root@pc1test]#ll-h......
  • 【Windows】SAM文件破解
    目录win7win10nullwin7在对方不知情,不知道对方密码的情况下,破解密码以Win7为例步骤使用kali-live镜像(U盘版本),直接插入他人电脑就可直接运行模仿插入U盘进入BIOS,设置从镜像启动选择启动项将CD—ROM移动至第一个F10保存默认选中第一个,回车进来后,点击桌面Home,选......
  • C语言编程技巧 全局变量在多个c文件中公用的方法
    在使用C语言编写程序时,经常会遇到这样的情况:我们希望在头文件中定义一个全局变量,并将其包含在两个不同的C文件中,以便这个全局变量可以在这两个文件中共享。举个例子,假设项目文件夹"project"下有三个文件:main.c、common.c和common.h。在这种情况下,我们希望声明一个字符型变量"key",......
  • JavaWeb中的文件上传和下载功能的实现
    导入相关支持jar包:commons-fileupload.jar,commons-io.jar对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件......
  • 四、文件操作
    四、文件操作4.1新增文件(touch)1toucha.txt//在当前目录下创建名为a的txt文件(文件不存在),如果文件存在,将文件时间属性修改为当前系统时间4.2删除文件(rm)1rm文件名//删除当前目录下的文件2rm-f文件名//删除当前目录的的文件......
  • JavaWeb-文件的上传和下载
    文件上传1.要有一个form标签,method=post请求2.form标签的encType属性的值必须为multipart/form-data值3.在from标签中使用inputtype=file添加上传的文件4.编写服务器代码接收上传的数据Content-Type:表示提交的数据类型enctype="multipart/form-data":表示提交的数据,以多段(每......
  • 关键字 开发-04 yaml文件定义变量与引用变量
    前言:上篇使用jinja2模板渲染数据是在读取yaml文件的时候,进行渲染。这种肯定不是关键字框架的渲染的方式。正常我们想要的而是在yaml文件中写入我们想要渲染的数据,然后读取之后渲染到测试yaml用例中。1.在yaml文件中引入变量由于变量在yaml中先声明,后引用,所以不能直接渲染整个ya......
  • 关于编译形状和字体文件
    关于编译形状和字体文件AutoCAD2018Help|AboutCompilingShapeandFontFiles|Autodesk可以定义、创建和编译形状和字体文件,以便在图形中使用自定义符号和文本字体。 形状是像块一样使用的对象。块比形状更通用,更易于使用和插入。但是,对于程序来说,形状的存储和绘制效......