压缩成.zip

代码如下:

/**
     * 压缩成ZIP
     *
     * @param srcDir           压缩文件夹路径
     * @param out              压缩文件输出流
     * @throws RuntimeException 压缩失败会抛出运行时异常
     */

public static void toZip(String srcDir, OutputStream out) throws RuntimeException {

    long start = System.currentTimeMillis();

    ZipOutputStream zos = null;

    try {

        zos = new ZipOutputStream(out);

        File sourceFile = new File(srcDir);

        compress(sourceFile, zos, sourceFile.getName(), false);

        long end = System.currentTimeMillis();

        System.out.println("压缩完成,耗时:"   (end - start)   " ms");

    } catch (Exception e) {

        throw new RuntimeException("zip error from ZipUtils", e);

    } finally {

        if (zos != null) {

            try {

                zos.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }
}

/**
     * 递归压缩方法
     *
     * @param sourceFile       源文件
     * @param zos              zip输出流
     * @param name             压缩后的名称
     * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;
     *                         <p>
     *                         false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
     * @throws Exception
     */
private static void compress(File sourceFile, ZipOutputStream zos, String name,
                             boolean KeepDirStructure) throws Exception {
    byte[] buf = new byte[BUFFER_SIZE];

    if (sourceFile.isFile()) {

        // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字

        zos.putNextEntry(new ZipEntry(name));

        // copy文件到zip输出流中

        int len;

        FileInputStream in = new FileInputStream(sourceFile);

        while ((len = in.read(buf)) != -1) {

            zos.write(buf, 0, len);

        }

        // Complete the entry

        zos.closeEntry();

        in.close();

    } else {

        File[] listFiles = sourceFile.listFiles();

        if (listFiles == null || listFiles.length == 0) {

            // 需要保留原来的文件结构时,需要对空文件夹进行处理

            if (KeepDirStructure) {

                // 空文件夹的处理

                zos.putNextEntry(new ZipEntry(name   "/"));

                // 没有文件,不需要文件的copy

                zos.closeEntry();
            }

        } else {

            for (File file : listFiles) {

                // 判断是否需要保留原来的文件结构

                if (KeepDirStructure) {

                    // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,

                    // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了

                    compress(file, zos, name   "/"   file.getName(), KeepDirStructure);

                } else {

                    compress(file, zos, file.getName(), KeepDirStructure);

                }


            }

        }

    }

}

测试验证代码:

/**
	 * 测试打包本地的Navicat,输出为zip文件
	 * @throws Exception
	 */
@Test
public void test() throws Exception {
    //Navicat路径
    String inDir = "E:\\developer\\Navicat";
    //打包后输出路径
    String outDir = "E:\\developer\\NavicatZip\\Navicat.zip";
    OutputStream fileOutputStream = new FileOutputStream(new File(outDir));
    ZipUtils.toZip(inDir, fileOutputStream);
}

打包前后的文件如下:

解压.zip

代码如下:

/**
     * 解压zip文件到指定目录
     * @param fileZip
     * @param path_to_dest
     * @throws IOException
     */
public static void readZip(String fileZip,String path_to_dest) throws IOException {

    try (FileInputStream fis = new FileInputStream(fileZip);
         ZipInputStream zis =
         new ZipInputStream(new BufferedInputStream(fis))) {

        ZipEntry entry;

        // 从ZipInputStream读取每个条目,直到没有
        // 发现更多条目,返回值为空
        // getNextEntry()方法。
        while ((entry = zis.getNextEntry()) != null) {
            System.out.println("Unzipping: "   entry.getName());

            int size;
            byte[] buffer = new byte[2048];
            File fileOut = new File(path_to_dest "\\" entry.getName());
            try (FileOutputStream fos =
                 new FileOutputStream(fileOut);
                 BufferedOutputStream bos =
                 new BufferedOutputStream(fos, buffer.length)) {

                while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
                    bos.write(buffer, 0, size);
                }
                bos.flush();
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

测试验证代码:

/**
     * 测试解压本地zip文件
     * @throws Exception
     */
@Test
public void readZip() throws Exception {
    //解压后路径
    String path_to_dest = "E:\\developer\\NavicatUnzip";
    //zip文件路径
    String fileZip = "E:\\developer\\NavicatZip\\Navicat.zip";
    ZipUtils.readZip(fileZip, path_to_dest);
}

解压前后的文件如下:

以上就是Java实现文件压缩为zip和解压zip压缩包的详细内容,更多关于Java文件压缩为zip的资料请关注Devmax其它相关文章!

Java实现文件压缩为zip和解压zip压缩包的更多相关文章

  1. ios – AFNetworking启用GZIP

    我在AFNetworking网站上查看支持GZIP压缩“服务器响应的Gzip解压缩已经内置在AFNetworking中,因为NSURLConnection将使用content-encoding:gzipHTTP头自动解压缩响应.”–AFNetworking常见问题如何启用GZIP压缩,以便我可以从服务器压缩数据或已经默认为谢谢!

  2. xcode – xcrun因zip I / O错误而失败:没有这样的文件或目录zip错误:

    尝试使用xcrun导出存档失败,出现以下错误:解决方法xcrun需要绝对路径.(即/User/you/…

  3. ios – 如何从我的文档目录创建.zip文件?

    我想从我的文档目录创建一个ZIP文件.我也想把它作为电子邮件附件发送.解决方法ZipArchive是一个压缩或解压缩zip文件的Objective-C类,它基于开源代码“MiniZip”.它可用于iPhone应用程序开发,也可用于MacOSX上的cocoa.看到这个:http://code.google.com/p/ziparchive/downloads/list

  4. android – 在SDCard上创建带有一些文件的zip文件

    正如我几天前发布的一个问题,我意识到股票电子邮件应用程序无法发送附件中的多个文件:https://stackoverflow.com/questions/5773006/sending-email-with-multiple-attachement-fail-with-default-email-android-app-but不幸的是,我没有得到答案,所以需要找到一个解决方法.用户必须在列表中选择

  5. android – 在apk中将apk转换为zip可以在clockWorkMod中闪存吗?

    如何将apk转换为可在clockWorkMod中刷新的zip?我尝试过使用ApkInstaller.它没用.继续得到错误;“安装中止”.解决方法您只需将应用程序的.apk扩展名更改为.zip然后将.zip放入SD卡中,看看是否可以使用CWM闪存.我不知道你想要做什么,所以如果你能指定更多的信息会很棒.如果您想要的只是将应用程序安装到手机中,那么您可以按照此tutorial进行操作.

  6. android-emulator – 在Android Studio中安装带有zip文件的Android Emulator

    我无法在我的androidstudio安装中安装模拟器,所以我从工作室复制了这个链接并下载了zip文件……

  7. 从您的Android资产文件夹中的ZIP文件中读取文件

    我正在使用ZipInputStream从位于我的Android资产文件夹的ZIP文件中读取文件:它的工作原理很慢,因为它必须使用getNextEntry()顺序读取它,并且有相当多的文件.如果我将ZIP文件复制到SD卡上,使用ZipFile.getEntry时,阅读速度非常快,但是我没有找到使用ZipFile资源文件的方法!有没有办法以快速方式访问资产文件夹中的ZIP?我认为访问ZIP文件在两个不同的位置将是一个简单的方法来处理这个,但唉...)解决方法这对我有用:

  8. android – 如何“安装”Action Bar Sherlock?

    我应该安装哪个库?解决方法没有听到包含动作栏的兼容性库,几天前我已经下载了最后一个.无论如何,它很简单,解压缩文件IN(!!

  9. PHP实现文件安全下载

    例如你希望客户要填完一份表格,才可以下载某一文件,你第一个想法一定是用"Redirect"的方法,先检查表格是否已经填写完毕和完整,然后就将网址指到该文件,这样客户才能下载,但如果你想做一个关于"网上购物"的电子商务网站,考虑安全问题,你不想用户直接复制网址下载该文件,笔者建议你使用PHP直接读取该实际文件然后下载的方法去做。feof){echofread;}fclose;}这样就可以用PHP直接输出文件了。

  10. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部