精华内容
下载资源
问答
  • java zip
    千次阅读
    2021-02-26 15:18:09

    我有一个创建的压缩文件存在问题 - 试图解压缩窗口时显示有错误。这是代码问题吗?java zip压缩文件损坏

    File dir = new File("M:\\SPOT/netbeanstest/TEST/PDF");

    String archiveName = "test.zip";

    byte[] buf = new byte[1024];

    try {

    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(

    archiveName));

    for (String s : dir.list()) {

    File toCompress = new File(dir, s);

    FileInputStream fis = new FileInputStream(toCompress);

    zos.putNextEntry(new ZipEntry(s));

    int len;

    while((len = fis.read(buf))>0){

    zos.write(buf, 0, len);

    }

    zos.closeEntry();

    fis.close();

    }

    } catch (FileNotFoundException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    +1

    你应该()'在finally块用'zos.close关闭'ZipOutputStream'为好。 –

    +0

    更多相关内容
  • 解决java zip压缩文件里面带有中文文件,在java代码解压时报错,或者无法解压问题
  • 使用java压缩也解压zip文件方法,解决中文乱码问题。使用java自带的压缩解压算法,会出现中文乱码问题。使用apache io的zip包,有效解决该问题。Ant的压缩解压,也是使用该类。
  • java 中压缩ZIP格式源码,仅供参考。
  • 使用javazip压缩库 对文件和文件夹实现压缩
  • java zip解压

    千次阅读 2021-06-05 15:46:07
    前言:zip解压Windows默认是GBK,Mac默认是UTF-8,为了保证都可以解压,就需要根据不同 的文件设置不同的编码格式,本文解决方案是根据是否乱码来判断(详见下文)

    前言:zip解压Windows默认是GBK,Mac默认是UTF-8,为了保证都可以解压,就需要根据不同的文件设置不同的编码格式,本文解决方案是根据是否乱码来判断(详见下文)

    如果解压过程中不需要操作文件请看方法一(三行解压到本地)

    如果解压过程中需要操作文件如网盘中实现在线解压,基本实现设想就是边解压,边创建文件夹(或上传文件)到网盘数据库,看方法二

    注:两种方法均引用于其他博客,但由于找不到原文地址了,望有知道的兄弟留言告知,及时加注上

    方法一:

    maven配置:

            <dependency>
                <groupId>net.lingala.zip4j</groupId>
                <artifactId>zip4j</artifactId>
                <version>1.3.2</version>
            </dependency>

    代码:

    package com.gxs.test.util;
    
    
    import net.lingala.zip4j.core.ZipFile;
    import net.lingala.zip4j.model.FileHeader;
    import java.util.List;
    
    /**
     * 已解决乱码问题
     */
    public class UnZipFiles {
    
        public static void unZip(String zipPath, String destDir) throws Exception {
            ZipFile zipFile = new ZipFile(zipPath);
            zipFile.setFileNameCharset(getEncoding(zipPath));
            zipFile.extractAll(destDir);
        }
    
        @SuppressWarnings("unchecked")
        private static String getEncoding(String path) throws Exception {
            String encoding = "GBK";
            ZipFile zipFile = new ZipFile(path);
            zipFile.setFileNameCharset(encoding);
            List<FileHeader> list = zipFile.getFileHeaders();
            for (int i = 0; i < list.size(); i++) {
                FileHeader fileHeader = list.get(i);
                String fileName = fileHeader.getFileName();
                if (isMessyCode(fileName)) {
                    encoding = "UTF-8";
                    break;
                }
            }
            return encoding;
        }
    
        private static boolean isMessyCode(String str) {
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                // 当从Unicode编码向某个字符集转换时,如果在该字符集中没有对应的编码,则得到0x3f(即问号字符?)
                // 从其他字符集向Unicode编码转换时,如果这个二进制数在该字符集中没有标识任何的字符,则得到的结果是0xfffd
                if ((int) c == 0xfffd) {
                    // 存在乱码
                    return true;
                }
            }
            return false;
        }
    
    
    
        public static void main(String[] args){
            /**
             * 解压文件
             */
            String zipFile = "E:\\ziptest\\测试1级目录.zip";
            String path = "E:\\ziptest";
            try {
                unZip(zipFile, path);
            } catch (Exception e) {
                e.printStackTrace();
            }
            ;
    
        }
    }
    
    
    

    方法二:

    代码:

    package com.gxs.test.util;
    
    import org.springframework.stereotype.Component;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.nio.charset.Charset;
    import java.util.zip.CRC32;
    import java.util.zip.CheckedInputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    
    /**
     * zip压缩工具类
     *  @className: UnzipUtils
     *  @author: gxs
     *  @date: 2021/6/5 9:13
     *  @version: 1.0
     */
    @Component
    public class UnzipUtil {
    
        private static final int BUFFER = 1024;
        private static final String CODING_UTF8 = "UTF-8";
        private static final String CODING_GBK = "GBK";
    
        /**
         * 解压入口方法
         *
         * @param zipPath zip文件物理地址
         * @param unzipPath 解压后存放路径
         * @throws Exception
         */
        public static void decompress(String zipPath, String unzipPath)  throws Exception {
            //解压缩执行方法
            decompressFile(new File(zipPath), new File(unzipPath));
        }
    
        /**
         * 解压缩执行方法
         *
         * @param srcFile 压缩文件File实体
         * @param destFile 解压路径File实体
         * @throws Exception
         */
        public static void decompressFile(File srcFile, File destFile) throws Exception {
            //创建数据输入流
            CheckedInputStream cis = new CheckedInputStream(new FileInputStream(srcFile), new CRC32());
            //创建压缩输入流
            ZipInputStream zis = new ZipInputStream(cis, Charset.forName(CODING_UTF8));
            //异常捕获的方式判断编码格式
            try {
                //判断代码,如果此代码未抛出异常,则表示编码为UTF-8
                zis.getNextEntry().getName();
            } catch (Exception e) {
                //如果乱码会抛异常,抛异常重新创建输入流,重新设置编码格式
                cis = new CheckedInputStream(new FileInputStream(srcFile), new CRC32());
                zis = new ZipInputStream(cis, Charset.forName(CODING_GBK));
            }
            //解压zip
            decompressZis(destFile, zis);
            //关闭流
            zis.close();
    
        }
    
        /**
         * 文件 解压缩执行方法
         *
         * @param destFile 目标文件
         * @param zis ZipInputStream
         * @throws Exception
         */
        private static void decompressZis(File destFile, ZipInputStream zis)   throws Exception {
            ZipEntry entry;
            while ((entry = zis.getNextEntry()) != null) {
                //获取当前的ZIP条目路径
                String dir = destFile.getPath() + File.separator + entry.getName();
                File dirFile = new File(dir);
                //递归检查文件路径,路径上没有文件夹则创建,保证整条路径在本地存在
                fileProber(dirFile);
                //判断是否是文件夹
                if (entry.isDirectory()) {
                    //如果是,创建文件夹
                    dirFile.mkdirs();
                    System.out.println(dirFile.getName());
                } else {
                    //如果不是文件夹,数据流输出,生成文件
                    decompressFile(dirFile, zis);
                }
                //关闭当前的ZIP条目并定位流
                zis.closeEntry();
            }
        }
    
        /**
         * 文件探针,当父目录不存在时,创建目录
         * 
         * @param dirFile ZIP条目路径
         */
        private static void fileProber(File dirFile) {
            //获取此路径的父目录
            File parentFile = dirFile.getParentFile();
            //判断是否存在
            if (!parentFile.exists()) {
                // 递归寻找上级目录
                fileProber(parentFile);
                //直至存在,递归执行创建文件夹
                parentFile.mkdir();
            }
    
        }
    
        /**
         * 生成文件
         * 
         * @param destFile 目标文件
         * @param zis ZipInputStream
         * @throws Exception
         */
        private static void decompressFile(File destFile, ZipInputStream zis) throws Exception {
            //创建输出流
            BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(destFile));
            //转成byte数组
            int count;
            byte[] data = new byte[BUFFER];
            //读取并写入文件
            while ((count = zis.read(data, 0, BUFFER)) != -1) {
                bos.write(data, 0, count);
            }
            //关闭数据流
            bos.close();
        }
    
        public static void main(String[] args){
            try {
                decompress("E:\\ziptest\\测试1级目录.zip", "E:\\ziptest\\");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    展开全文
  • Java 1.1实现了I/O数据流与网络数据流的单一接口,因此数据的压缩、网络传输和解 压缩的实现比较容易,下面介绍利用ZipEntry、ZipInputStream和ZipOutputStream三个Java 类实现zip数据压缩方式的编程方法。 zip压缩...
  •   Zip是常用的无损压缩算法实现,Java中提供了Zip的实现,本文演示基于内存的方式进行压缩和解压,演示只针对一层目录结构进行,多层目录只需递归操作进行即可。   文中提供完整的工具类,以供大家使用。   ...

    欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

      Zip是常用的无损压缩算法实现,Java中提供了Zip的实现,本文演示基于内存的方式进行压缩和解压,演示只针对一层目录结构进行,多层目录只需递归操作进行即可。

      文中提供完整的工具类,以供大家使用。

      Maven依赖

      ant: ant: 1.8.0:JDK1.7以下版本环境下,JDK原生的ZIP流处理会出现中文条目乱码的问题,此依赖提供了ZIP相关的流实现, 可以完美的解决低版本JDK出现的问题。JDK1.7及JDK1.7+版本上已无此问题。

      commons-io: commons-io: 2.4: JDK原生的流操作是比较繁琐的,例如:流的开闭处理、流的转换处理等,会使得代码无序且凌乱。commons-io针对IO操作提供了良好的封装,可以使用简单的操作完成繁杂的处理,commons-io本身已经对IO做了相对完善的封装。

    <dependency>
    	<groupId>ant</groupId>
    	<artifactId>ant</artifactId>
    	<version>1.8.0</version>
    </dependency>
    <dependency>
    	<groupId>commons-io</groupId>
    	<artifactId>commons-io</artifactId>
    	<version>2.4</version>
    </dependency>
    

      工具类

      通常情况下,可能并不会使用基于内存压缩的方式,但在某些业务场景下,还是有其施展的舞台。

      下面是提供的ZIP算法实现的工具类,提供了compressByZip、compressByZipJdkLower7、decompressByZip三个方法,在无特殊需求的情况下,基本可以满足压缩和解压的需求,代码如下:

    package com.arhorchin.securitit.compress.zip;
    
    import java.io.BufferedInputStream;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    import java.util.zip.ZipOutputStream;
    
    import org.apache.poi.util.IOUtils;
    
    /**
     * @author Securitit.
     * @note 基于内存以ZIP算法进行压缩和解压工具类.
     */
    public class ZipRamUtil {
    
        /**
         * 条目名称使用的默认字符.
         */
        public static String CHARSET_GBK = "GBK";
    
        /**
         * 使用ZIP算法进行压缩.
         * @param sourceFileBytesMap 待压缩文件的Map集合.
         * @return 压缩后的ZIP文件字节数组.
         * @throws Exception 压缩过程中可能发生的异常,若发生异常,则返回的字节数组长度为0.
         */
        public static byte[] compressByZip(Map<String, byte[]> sourceFileBytesMap) throws Exception {
            // 变量定义.
            ZipEntry zipEntry = null;
            ZipOutputStream zipZos = null;
            ByteArrayOutputStream zipBaos = null;
    
            try {
                // 压缩文件变量初始化.
                zipBaos = new ByteArrayOutputStream();
                zipZos = new ZipOutputStream(zipBaos);
                // 将文件添加到ZIP条目中.
                if (null != sourceFileBytesMap && sourceFileBytesMap.size() > 0) {
                    for (Map.Entry<String, byte[]> singleFile : sourceFileBytesMap.entrySet()) {
                        zipEntry = new ZipEntry(singleFile.getKey());
                        zipZos.putNextEntry(zipEntry);
                        zipZos.write(singleFile.getValue());
                    }
                } else {
                    zipBaos = new ByteArrayOutputStream();
                }
            } finally {
                if (null != zipBaos)
                    zipBaos.close();
                if (null != zipZos)
                    zipZos.close();
            }
            return zipBaos.toByteArray();
        }
    
        /**
         * 使用ZIP算法进行压缩.
         * @param sourceFileBytesMap 待压缩文件的Map集合.
         * @return 压缩后的ZIP文件字节数组.
         * @throws Exception 压缩过程中可能发生的异常,若发生异常,则返回的字节数组长度为0.
         */
        public static byte[] compressByZipJdkLower7(Map<String, byte[]> sourceFileBytesMap) throws Exception {
            return compressByZipJdkLower7(sourceFileBytesMap, CHARSET_GBK);
        }
    
        /**
         * 使用ZIP算法进行压缩.
         * @param sourceFileBytesMap 待压缩文件的Map集合.
         * @return 压缩后的ZIP文件字节数组.
         * @throws Exception 压缩过程中可能发生的异常,若发生异常,则返回的字节数组长度为0.
         */
        public static byte[] compressByZipJdkLower7(Map<String, byte[]> sourceFileBytesMap, String charset)
                throws Exception {
            // 变量定义.
            ByteArrayOutputStream zipBaos = null;
            org.apache.tools.zip.ZipOutputStream zipZos = null;
    
            try {
                // 压缩文件变量初始化.
                zipBaos = new ByteArrayOutputStream();
                zipZos = new org.apache.tools.zip.ZipOutputStream(zipBaos);
                // 将文件添加到ZIP条目中.
                if (null != sourceFileBytesMap && sourceFileBytesMap.size() > 0) {
                    for (Map.Entry<String, byte[]> singleFile : sourceFileBytesMap.entrySet()) {
                        zipZos.putNextEntry(new org.apache.tools.zip.ZipEntry((singleFile.getKey())));
                        zipZos.write(singleFile.getValue());
                    }
                } else {
                    zipBaos = new ByteArrayOutputStream();
                }
            } finally {
                if (null != zipBaos)
                    zipBaos.close();
                if (null != zipZos)
                    zipZos.close();
            }
            return zipBaos.toByteArray();
        }
    
        /**
         * 使用ZIP算法进行解压.
         * @param sourceZipFileBytes ZIP文件字节数组.
         * @return 解压后的文件Map集合.
         * @throws Exception 解压过程中可能发生的异常,若发生异常,返回Map集合长度为0.
         */
        public static Map<String, byte[]> decompressByZip(byte[] sourceZipFileBytes) throws Exception {
            // 变量定义.
            String zipEntryName = null;
            ZipEntry singleZipEntry = null;
            ZipInputStream sourceZipZis = null;
            BufferedInputStream sourceZipBis = null;
            ByteArrayInputStream sourceZipBais = null;
            Map<String, byte[]> targetFilesFolderMap = null;
    
            try {
                // 解压变量初始化.
                targetFilesFolderMap = new HashMap<String, byte[]>();
                sourceZipBais = new ByteArrayInputStream(sourceZipFileBytes);
                sourceZipBis = new BufferedInputStream(sourceZipBais);
                sourceZipZis = new ZipInputStream(sourceZipBis);
                // 条目解压缩至Map中.
                while ((singleZipEntry = sourceZipZis.getNextEntry()) != null) {
                    zipEntryName = singleZipEntry.getName();
                    targetFilesFolderMap.put(zipEntryName, IOUtils.toByteArray(sourceZipZis));
                }
            } finally {
                if (null != sourceZipZis)
                    sourceZipZis.close();
                if (null != sourceZipBis)
                    sourceZipBis.close();
                if (null != sourceZipBais)
                    sourceZipBais.close();
    
            }
            return targetFilesFolderMap;
        }
    
    }
    

      工具类测试

      在Maven依赖引入正确的情况下,复制上面的代码到项目中,修改package,可以直接使用,下面我们对工具类进行简单测试。测试类代码如下:

    package com.arhorchin.securitit.compress.zip;
    
    import java.io.File;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.commons.io.FileUtils;
    
    import com.arhorchin.securitit.compress.zip.ZipRamUtil;
    
    /**
     * @author Securitit.
     * @note ZipRamUtil工具类测试.
     */
    public class ZipRamUtilTester {
    
        public static void main(String[] args) throws Exception {
            Map<String, byte[]> fileBytesMap = null;
    
            fileBytesMap = new HashMap<String, byte[]>();
            // 设置文件列表.
            File dirFile = new File("C:/Users/Administrator/Downloads/个人文件/2020-07-13/files");
            for (File file : dirFile.listFiles()) {
                fileBytesMap.put(file.getName(), FileUtils.readFileToByteArray(file));
            }
    
            byte[] memoryBytes = ZipRamUtil.compressByZip(fileBytesMap);
            FileUtils.writeByteArrayToFile(new File("C:/Users/Administrator/Downloads/个人文件/2020-07-13/ram.zip"), memoryBytes);
            
            fileBytesMap = ZipRamUtil.decompressByZip(memoryBytes);
            System.out.println(fileBytesMap.size());
        }
    
    }
    

      运行测试后,通过查看ram.zip和控制台输出解压后文件数量,可以确认工具类运行结果无误。

      总结

      1) 在小文件、文件数量较小且较为固定时,提倡使用基于内存压缩和解压方式。使用内存换时间,减少频繁的磁盘操作。

      2) 在大文件、文件数量较大时,提倡使用基于磁盘压缩和解压方式。过大文件对服务会造成过度的负载,磁盘压缩和解压可以缓解这种压力。可以参见《Java Zip 基于磁盘实现压缩和解压》

      3) JDK1.6及以下版本中,JDK提供的java.util.zip.*进行压缩时,对于中文条目名称处理会出现乱码,需要额外引用Ant包,使用其org.apache.tools.zip.*来解决这个问题。

      若文中存在错误和不足,欢迎指正!

    本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
    在这里插入图片描述

    展开全文
  • 网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void main(String args[]) { new ZipUtil().unZip("E:\\...
  • java项目中常使用到的工具类:zip压缩解压缩、rar解压(有密码的文件)、gz解压、FTP上传与下载
  • Zip4j-一个用于zip文件/流的Java库 谢谢 用于评定Zip4j作为最佳Javazip文件[ , , , ]。 经过了几年的间隔,这鼓励了我重新实现这个项目。 我试图添加这段时间所要求的一些重要功能,并使API更加整洁。 较新的...
  •   Zip是常用的无损压缩算法实现,Java中提供了Zip的实现,本文演示基于磁盘的方式进行压缩和解压,演示只针对一层目录结构进行,多层目录只需递归操作进行即可。   文中提供完整的工具类,以供大家使用。   ...

    欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

      Zip是常用的无损压缩算法实现,Java中提供了Zip的实现,本文演示基于磁盘的方式进行压缩和解压,演示只针对一层目录结构进行,多层目录只需递归操作进行即可。

      文中提供完整的工具类,以供大家使用。

      Maven依赖

      ant: ant: 1.8.0:JDK1.7以下版本环境下,JDK原生的ZIP流处理会出现中文条目乱码的问题,此依赖提供了ZIP相关的流实现, 可以完美的解决低版本JDK出现的问题。JDK1.7及JDK1.7+版本上已无此问题。

      commons-io: commons-io: 2.4: JDK原生的流操作是比较繁琐的,例如:流的开闭处理、流的转换处理等,会使得代码无序且凌乱。commons-io针对IO操作提供了良好的封装,可以使用简单的操作完成繁杂的处理,commons-io本身已经对IO做了相对完善的封装。

    <dependency>
    	<groupId>ant</groupId>
    	<artifactId>ant</artifactId>
    	<version>1.8.0</version>
    </dependency>
    <dependency>
    	<groupId>commons-io</groupId>
    	<artifactId>commons-io</artifactId>
    	<version>2.4</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    

      工具类

      其实,在通常情况下,我们都是在磁盘上进行压缩和解压操作的,这样虽然增加了操作的复杂度,但是却无形中避免了一些问题。

      下面是提供的ZIP算法实现的工具类,提供了compressByZip、compressByZipJdkLower7、decompressByZip三个方法,在无特殊需求的情况下,基本可以满足压缩和解压的需求,代码如下:

    package com.arhorchin.securitit.compress.zip;
    
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    import java.util.zip.ZipOutputStream;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.commons.io.IOUtils;
    import org.apache.log4j.Logger;
    
    /**
     * @author Securitit.
     * @note 基于磁盘以ZIP算法进行压缩和解压工具类.
     */
    public class ZipDiskUtil {
    
        /**
         * logger.
         */
        private static Logger logger = Logger.getLogger(ZipDiskUtil.class);
    
        /**
         * 条目名称使用的默认字符.
         */
        public final static String CHARSET_GBK = "GBK";
    
        /**
         * 使用ZIP算法进行压缩.
         * @param sourceFolderPath 待进行压缩的文件夹路径.
         * @param targetZipFilePath 压缩后的ZIP文件存储目录.
         * @return 压缩是否成功.
         * @throws Exception 压缩过程中可能发生的异常,若发生异常,则不会生成ZIP文件.
         */
        public static boolean compressByZip(String sourceFolderPath, String targetZipFilePath) throws Exception {
            // 变量定义.
            File sourceFolderFile = null;
            ZipOutputStream zipZos = null;
            FileOutputStream zipFos = null;
            InputStream singleFileIs = null;
            File[] sourceFilesInFolder = null;
    
            try {
                // 取得待压缩文件列表.
                sourceFolderFile = new File(sourceFolderPath);
                sourceFilesInFolder = sourceFolderFile.listFiles();
                // 压缩文件变量初始化.
                zipFos = new FileOutputStream(new File(targetZipFilePath));
                zipZos = new ZipOutputStream(zipFos);
                // 将文件添加到ZIP条目中.
                for (File singleFile : sourceFilesInFolder) {
                    zipZos.putNextEntry(new ZipEntry(singleFile.getName()));
                    singleFileIs = new FileInputStream(singleFile);
                    IOUtils.copy(singleFileIs, zipZos);
                }
            } catch (Exception ex) {
                logger.info("ZipDiskUtil.compressByZip.", ex);
                return false;
            } finally {
                if (null != singleFileIs)
                    singleFileIs.close();
                if (null != zipZos)
                    zipZos.close();
                if (null != zipFos)
                    zipFos.close();
            }
            return true;
        }
    
        /**
         * 使用ZIP算法进行压缩.JDK1.7版本一下,对中文处理不是很友好,可以使用这个方法解决.
         * @param sourceFolderPath 待进行压缩的文件夹路径.
         * @param targetZipFilePath 压缩后的ZIP文件存储目录.
         * @return 压缩是否成功.
         * @throws Exception 压缩过程中可能发生的异常,若发生异常,则不会生成ZIP文件.
         */
        public static boolean compressByZipJdkLower7(String sourceFolderPath, String targetZipFilePath) throws Exception {
            return compressByZipJdkLower7(sourceFolderPath, targetZipFilePath, CHARSET_GBK);
        }
    
        /**
         * 使用ZIP算法进行压缩.JDK1.7版本一下,对中文处理不是很友好,可以使用这个方法解决.
         * @param sourceFolderPath 待进行压缩的文件夹路径.
         * @param targetZipFilePath 压缩后的ZIP文件存储目录.
         * @param charset 压缩条目使用的字符集.
         * @return 压缩是否成功.
         * @throws Exception 压缩过程中可能发生的异常,若发生异常,则不会生成ZIP文件.
         */
        public static boolean compressByZipJdkLower7(String sourceFolderPath, String targetZipFilePath, String charset)
                throws Exception {
            // 变量定义.
            File sourceFolderFile = null;
            FileOutputStream zipFos = null;
            InputStream singleFileIs = null;
            File[] sourceFilesInFolder = null;
            org.apache.tools.zip.ZipOutputStream zipZos = null;
    
            try {
                // 取得待压缩文件列表.
                sourceFolderFile = new File(sourceFolderPath);
                sourceFilesInFolder = sourceFolderFile.listFiles();
                // 压缩文件变量初始化.
                zipFos = new FileOutputStream(new File(targetZipFilePath));
                zipZos = new org.apache.tools.zip.ZipOutputStream(zipFos);
                // 设置条目名称编码.
                zipZos.setEncoding(charset);
                // 将文件添加到ZIP条目中.
                for (File singleFile : sourceFilesInFolder) {
                    zipZos.putNextEntry(new org.apache.tools.zip.ZipEntry((singleFile.getName())));
                    singleFileIs = new FileInputStream(singleFile);
                    IOUtils.copy(singleFileIs, zipZos);
                }
            } catch (Exception ex) {
                logger.info("ZipDiskUtil.compressByZipJdkLower7.", ex);
                return false;
            } finally {
                if (null != singleFileIs)
                    singleFileIs.close();
                if (null != zipFos)
                    zipFos.close();
                if (null != zipZos)
                    zipZos.close();
            }
            return true;
        }
    
        /**
         * 使用ZIP算法进行解压.
         * @param sourceZipPath 待解压文件路径.
         * @param targetFolderPath 解压后文件夹目录.
         * @return 解压是否成功.
         * @throws Exception 解压过程中可能发生的异常,若发生异常,则不会生成文件夹.
         */
        public static boolean decompressByZip(String sourceZipPath, String targetFolderPath) throws Exception {
            // 变量定义.
            ZipEntry singleZipEntry;
            String zipEntryName = null;
            ZipInputStream zipZis = null;
            FileInputStream zipFis = null;
            BufferedInputStream zipBis = null;
    
            try {
                // 解压变量初始化.
                zipFis = new FileInputStream(new File(sourceZipPath));
                zipBis = new BufferedInputStream(zipFis);
                zipZis = new ZipInputStream(zipBis);
                // 条目解压缩至指定文件夹目录下.
                while ((singleZipEntry = zipZis.getNextEntry()) != null) {
                    zipEntryName = singleZipEntry.getName();
                    FileUtils.writeByteArrayToFile(new File(targetFolderPath + File.separator + zipEntryName),
                            IOUtils.toByteArray(zipZis));
                }
            } catch (Exception ex) {
                logger.info("ZipDiskUtil.decompressByZip.", ex);
                return false;
            } finally {
                if (null != zipFis)
                    zipFis.close();
                if (null != zipZis)
                    zipZis.close();
                if (null != zipBis)
                    zipBis.close();
            }
            return true;
        }
    
    }
    

      工具类测试

      在Maven依赖引入正确的情况下,复制上面的代码到项目中,修改package,可以直接使用,下面我们对工具类进行简单测试。测试类代码如下:

    package com.arhorchin.securitit.compress.zip;
    
    import com.arhorchin.securitit.compress.zip.ZipDiskUtil;
    
    /**
     * @author Securitit.
     * @note ZipDiskUtil工具类测试.
     */
    public class ZipDiskUtilTester {
    
        public static void main(String[] args) throws Exception {
            ZipDiskUtil.compressByZip("C:/Users/Administrator/Downloads/个人文件/2020-07-13/files", "C:/Users/Administrator/Downloads/个人文件/2020-07-13/disk.zip");
            ZipDiskUtil.decompressByZip("C:/Users/Administrator/Downloads/个人文件/2020-07-13/disk.zip", "C:/Users/Administrator/Downloads/个人文件/2020-07-13-01/disk");
        }
    
    }
    

      运行测试后,通过查看disk.zip和解压的目录,可以确认工具类运行结果无误。

      总结

      1) 在小文件、文件数量较小且较为固定时,提倡使用基于内存压缩和解压方式。使用内存换时间,减少频繁的磁盘操作。可以参见《Java Zip 基于内存实现压缩和解压》

      2) 在大文件、文件数量较大时,提倡使用基于磁盘压缩和解压方式。过大文件对服务会造成过度的负载,磁盘压缩和解压可以缓解这种压力。

      3) JDK1.6及以下版本中,JDK提供的java.util.zip.*进行压缩时,对于中文条目名称处理会出现乱码,需要额外引用Ant包,使用其org.apache.tools.zip.*来解决这个问题。

    本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
    在这里插入图片描述

    展开全文
  • java 操作Zip文件(压缩、解压、加密) zip4j-1.3.2.jar ant-1.10.6.jar
  • java zip文件的压缩与解压

    千次阅读 2021-03-14 23:26:07
    java里面也提供了将文件进行压缩以减少传输时的数据量的类,可以很方便的将文件压缩成ZIP、JAR、GZIP等形java里面有个包叫java.util.zip提供zip文件压缩,但是编码的时候非常不方便。编码量太多了,通过搜索,发现...
  • 在检查所有代码没有问题的情况下依旧会报出解压文件错误,可能的原因是你使用了swagger来测试接口的运行,在swagger上下载Zip文件就会出现压缩文件末端的报错。 解决方法很简单,使用postman来测试下载接口是否可用...
  • zip4j Zip4J的分支版本。 有关原始版本,请参见 。
  • java Zip打包完整例子

    2015-12-10 19:31:01
    java打包文件夹为zip 或者打包文件 ,通过测试 zipcomcompressor 单个文件打包,循环打包速度会快非常多,要是打包文件夹,速度很慢。
  • 解决java ZIP压缩、解压缩(同时加解密)问题,代码部分
  • Java Zip压缩文件返回前端并下载

    千次阅读 2021-08-11 19:44:32
    https://www.cnblogs.com/yhc-love-cl/p/13596452.html 需要FileList,fileName ,response响应对象 , 读取完file到OutPutStream后, 设置到response的body ,并返回response实体对象。
  • poi.zip java读取excel文件,其中bin压缩文件中含有jar包,eclipse导入时可直接使用;src压缩文件含有java源代码,需要阅读源码的童鞋可以下载使用
  • java 纯内存解压zip文件,没有磁盘操作,效率高,基于apache commons-compress实现
  • java zip文件解压(含有密码解压)

    千次阅读 2020-10-21 15:14:06
    <dependency> <groupId>...zip4j</artifactId> <version>1.3.2</version> </dependency> public class CompressUtil { private static final Logger LOG.
  • Java Zip UnZip

    千次阅读 2019-04-05 14:20:20
    java里面有个包叫java.util.zip提供zip文件压缩,但是编码的时候非常不方便。编码量太多了,通过搜索,发现apache有个包提供一些简单的方法来实现zip文件的压缩与解压缩http://ant.apache.org/。下载地址:org....
  • Java ZIP压缩输入输出流

    万次阅读 多人点赞 2018-06-10 20:45:53
    ZIP是一种较为常见的压缩形式,在Java中要想实现ZIP的压缩需要导入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputStream、ZipEntry几个类完成。在JAVA IO中,不仅可以实现ZIP压缩格式的输入...
  • java zip操作

    2009-09-16 16:07:23
    java 操作 zip压缩,解压缩 java 操作 zip压缩,解压缩 java 操作 zip压缩,解压缩 java 操作 zip压缩,解压缩 java 操作 zip压缩,解压缩
  • java zip文件的多层级遍历和文件夹下目录的问题
  • java zip文件加密

    2013-03-27 15:24:49
    java zip压缩文件 加密代码和jar包
  • java实现zip压缩文件

    2013-08-06 09:54:39
    java实现文件/文件夹zip格式的压缩
  • 用rar和windows自带的zip工具压缩的文件都可以识别

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 981,206
精华内容 392,482
关键字:

java zip

友情链接: Exp2 8253.zip