java解压zip

java解压zip

目前有个需求,需要解压zip包,怎么做呢,我也不知道,先百度。
然后我发现了java.util.zip这个包,java自带这个包有没有!!百度上面虽然都是片段代码但是我顺藤摸瓜找到了java.util.zip。那么我们来看看这个目录的结构
这里写图片描述
然后找到了这个文章
https://blog.csdn.net/revivedsun/article/details/68932128
如果要看压缩的这个文章是很好的选择。

话不多说我根据上面的文章,我推断出大概的解压思路,并做了个demo。

思路:

获取zip文件里面的文件目录和文件信息,获取文件的流,然后通过File类创建并写入流就能实现解压了。

下面demo的使用

在D盘创建一个正常的full.zip文件就可以直接解压到d:/code这个目录下面。
然后运行下面的main方法可以解压zip文件了。

对于File相关的方法不懂的可以看这篇

https://blog.csdn.net/arios171/article/details/81097636

public class HeHe {
    public static void main(String[] args) {
        File parent = new File("d:/code");
        try {
            //也就是说这个文件后缀是不是zip
            ZipFile zipFile = new ZipFile("d:/full.zip");
            System.out.println(zipFile.stream());
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                ZipEntry zipEntry = entries.nextElement();
                File file = new File(parent, zipEntry.getName());
                if (zipEntry.isDirectory()) {
                    mkdirs(file);
                } else {
                    createFile(file);
                    InputStream is = zipFile.getInputStream(zipEntry);
                    FileOutputStream fos = new FileOutputStream(file);
                    byte[] b = new byte[1024];
                    int len = 0;
                    while ((len = is.read(b)) != -1) {
                        fos.write(b, 0, len);
                    }
                }
                System.out.println(zipEntry.getName());

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建文件
     *
     * @param path 文件字符串路径例如d:/fulld/why/ass/a/asd
     */
    public static void createFile(String path) {
        createFile(new File(path));
    }

    /**
     * 创建文件
     *
     * @param file file类
     */
    private static void createFile(File file) {
        if (file.exists() && file.isFile()) {
            file.delete();
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }
        File parentFile = file.getParentFile();
        if (parentFile.exists()) {
            if (parentFile.isFile()) {
                parentFile.delete();
                parentFile.mkdirs();
            }
        } else {
            parentFile.mkdirs();
        }
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建文件夹
     *
     * @param path 文件夹的路径字符串例如d:/fulld/why/ass/a/asd/
     * @return 如果本来就存在或者创建成功,那么就返回true
     */
    public static void mkdirs(String path) {
        mkdirs(new File(path));
    }

    /**
     * 创建文件夹
     *
     * @param file file类
     */
    public static void mkdirs(File file) {
        if (file.exists() && file.isDirectory()) {
            return;
        }
        if (file.exists()) {
            file.delete();
            file.mkdirs();
        } else {
            file.mkdirs();
        }
    }
}

效果图:
这里写图片描述
然后我给大家整理了下上面的代码作为工具,使用方法很简单,decompressed是解压,三个方法根据自己的需求使用,已经在安卓系统上试过了,没有任何问题可以使用,java跨平台。

public class ZipUtils {
    /**
     * 解压方法
     *
     * @param parent 解压到目录下
     * @param zip    zip文件
     */
    public static void decompressed(String parent, String zip) {
        try {
            decompressed(new File(parent), new ZipFile(zip));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 解压方法
     *
     * @param parent 解压到目录下
     * @param zip    zip文件
     */
    public static void decompressed(File parent, File zip) {
        try {
            decompressed(parent, new ZipFile(zip));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 解压方法
     *
     * @param parent  解压到目录下
     * @param zipFile zip文件
     */
    public static void decompressed(File parent, ZipFile zipFile) {
        mkdirs(parent);
        try {
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                ZipEntry zipEntry = entries.nextElement();
                File file = new File(parent, zipEntry.getName());
                if (zipEntry.isDirectory()) {
                    mkdirs(file);
                } else {
                    createFile(file);
                    InputStream is = zipFile.getInputStream(zipEntry);
                    FileOutputStream fos = new FileOutputStream(file);
                    byte[] b = new byte[1024];
                    int len;
                    while ((len = is.read(b)) != -1) {
                        fos.write(b, 0, len);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建文件顺便创建父目录
     *
     * @param path 文件字符串路径例如d:/fulld/why/ass/a/asd
     */
    public static void createFile(String path) {
        createFile(new File(path));
    }

    /**
     * 创建文件顺便创建父目录
     *
     * @param file file类
     */
    public static void createFile(File file) {
        if (file.exists() && file.isFile()) {
            file.delete();
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }
        File parentFile = file.getParentFile();
        if (parentFile.exists()) {
            if (parentFile.isFile()) {
                parentFile.delete();
                parentFile.mkdirs();
            }
        } else {
            parentFile.mkdirs();
        }
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建文件夹顺便创建父目录
     *
     * @param path 文件夹的路径字符串例如d:/fulld/why/ass/a/asd/
     * @return 如果本来就存在或者创建成功,那么就返回true
     */
    public static void mkdirs(String path) {
        mkdirs(new File(path));
    }

    /**
     * 创建文件夹顺便创建父目录
     *
     * @param file file类
     */
    public static void mkdirs(File file) {
        if (file.exists() && file.isDirectory()) {
            return;
        }
        if (file.exists()) {//肯定是文件了,文件删掉
            file.delete();
            file.mkdirs();
        } else {
            file.mkdirs();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值