Java 输入输出了下的简单解压操作

  • 简要介绍
    **在Java学习过程中,接触到输入输出流的概念,简介了压缩与解压简单技术,实际实现解压过程遇到了一个问题,如果多个文件夹多个文档如何顺序解压。
    本文以http://blog.youkuaiyun.com/isea533/article/details/7995472博客所写Java解压技术,进行总结了下,并总结过程中遇到的错误之处。**

  • 思路简析
    首先声明解压文件,如上文所述如果包含多个文件夹,则存在多个解压文件进入点(Entry),则通过Enumeration(枚举)方式,循环遍历每个进入点,例如如下图1所示有两个文件夹,每次进入点路径如图2所示,通过对象强制转换到ZipEntry,随后将目录逐层创建,如果只是单一目录文件夹,则如果不存在就将创建文件夹(在此声明,解压过程文件夹是单独创建,非解压创建),然后退出循环,不进行任何输入输出流操作。如果进入点遇到文件或文档,则将通过输入输出流方式进行解压操作。
    图1:
    这里写图片描述
    图2:
    这里写图片描述

  • 易错误点
    **1、在编写过程中,错误使用了if-else if 语句,此语句如果第一个if判断正确,则不会进行else if 语句判断。
    2、运行过程遇到文件夹拒绝访问错误,X:/XX拒绝访问,通过博客http://blog.youkuaiyun.com/j04110414/article/details/17795545所写才了解到,FileOutputStream使用过程中,需要注意你针对的是文件而不是文件夹,文件夹是无法进行输出操作的。
    3、本次编写jdk版本为1.7+,前文所写压缩博客无法解决如果文件名为汉字,将无法正确解压,我们只要在声明ZipFile 时,指定字符集为GBK格式,则可以解决,如下:
    ZipFile zipFile = new ZipFile(zipfile, Charset.forName("gbk"));**

  • 代码简析
    UnZipFiles类

public class UnZipFiles {

    public UnZipFiles() {
        // TODO Auto-generated constructor stub
    }

    public static void unZipFiles(String zipFilePath, String targetDir) throws IOException {
        // TODO Auto-generated constructor stub
        unZipFiles(new File(zipFilePath), targetDir);
    }

    @SuppressWarnings("resource")
    public static void unZipFiles(File zipfile, String targetDir){
        // TODO Auto-generated method stub
        File file = new File(targetDir);
        if(!file.exists()){
            file.mkdirs();
        }
        try {
            ZipFile zipFile = new ZipFile(zipfile, Charset.forName("gbk")); 
            for (Enumeration entries = zipFile.entries(); entries.hasMoreElements();) {
                ZipEntry entry = (ZipEntry) entries.nextElement();
                String subDir = (targetDir + entry.getName()).replace("\\", "/");
                System.out.println(subDir);
                File subFile = new File(subDir.substring(0, subDir.lastIndexOf("/")));
                if (!subFile.exists()) {
                    subFile.mkdirs();                   
                }
                if (new File(subDir).isDirectory()) {
                    continue;               
                }
                InputStream fIn = zipFile.getInputStream(entry);
                FileOutputStream fOut = new FileOutputStream(subDir);
                int b;
                while ((b = fIn.read()) != -1) {
                    fOut.write(b);
                }
                fIn.close();
                fOut.close();   
            }       
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

    }
}

主函数:

public static void main(String[] args) throws IOException {
        File file = new File("f:/test.zip");
        String path = "f:/jieya/";  
        UnZipFiles unZipFiles = new UnZipFiles();
        unZipFiles.unZipFiles(file, path);
    }

测试成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值