Java IO流中的 压缩流的使用

1 篇文章 0 订阅
1 篇文章 0 订阅

前言

最近刚学IO流 - -、 ,本来是结束了IO的基本学习,发现有个压缩流。闲来无事,随便看看。 在次记录 若有错误,希望大家指出。
从网上查阅资料,java io支持三种格式,压缩文件大概就为 ZIP、JAR、GZ这些。在这里我只讲ZIP格式的,其他格式的好像特性跟ZIP的格式都差不多 大家有兴趣可以去试一下
好像只需要掌握这四个类 压缩解压 就没什么问题。

所需要了解的类

ZipEntry
  • 压缩解压都需要用到的类.
  • 每压缩一个文件(夹)的时候 输出流都需要添加一个这个类
  • 每解压一个文件(夹)的时候 解压出的都是该类接收
  • 不知道说的准不准确 反正我个人觉着就是一个文件(夹)对应着一个对象,这里看不懂的话可以看代码摸索一下
  • 用上的方法:
    1. public ZipEntry(String name) 构造函数 就是设置你所压缩的文件名称为xx (name值)
    2. public boolean isDirectory() 返回布尔值 判断ZipEntry是否为文件夹
ZipOutputStream
  • 用上的方法:
    1. public ZipOutputStream(OutputStream out) 构造函数 传入个字节输出流
    2. public void putNextEntry(ZipEntry e) 开始编写新的ZIP文件条目,并将流定位到条目数据的开头。 这个方法是写入一个文件(夹) 看不懂的可以稍后看代码
ZipInputStream
  • 用上的方法:
    1. public ZipInputStream(InputStream out) 构造函数 传入个字节输入流
    2. public ZipEntry getNextEntry() 读取下一个ZIP文件条目,并将流定位在条目数据的开头。没有则返回null
ZipFile
  • 用上的方法:
    1. public ZipFile(File file) 构造函数 打开一个ZIP文件,读取指定的File对象。传入你需要解压的文件
    2. public InputStream getInputStream(ZipEntry entry) 返回用于读取指定zip文件条目内容的输入流。 这个是根据一个压缩类文件 ZipEntry 来返回一个输入流

简单介绍了一下这些用的上的类 而且我只会简单的压缩、解压 = - = 还有其他没说上的方法 大家可以自己去查阅一下api文档

话不多说直接上代码

压缩文件


public static void compressedAllZip(){
        //源文件    输入自己需要解压的文件或目录
        File sourceFile  = new File("c:prcture");
        //目的文件  输入自己需要解压的目录
        File purposeFile = new File("c:picture.zip");
        ZipOutputStream zos = null;

        try {
        	//实例化
            zos = new ZipOutputStream(new FileOutputStream(purposeFile));
            Zip(zos,sourceFile,sourceFile.getName());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        	//关闭资源 代码在下面
            myClose(zos,null);
        }
 }

	/**
     *      将要压缩的文件和文件名放入
     * @param zos       压缩输出流
     * @param file      所要压缩的文件
     * @param name      所要压缩的文件名称
     */
    public static void Zip(ZipOutputStream zos,File file,String name) throws IOException {
        //判断传来文件是否是文件夹
        if(file.isDirectory()){
            //创建文件夹
            zos.putNextEntry(new ZipEntry(name+File.separator));
            //将文件夹中的文件取出,遍历
            File[] files = file.listFiles();
            for (File f:files) {
                //递归
                Zip(zos,f,name+File.separator+f.getName());
            }
        }else{
            //将文件写入压缩包中
            zos.putNextEntry(new ZipEntry(name));
            //实例化源文件
            FileInputStream fis = new FileInputStream(file);

            int i = 0;
            byte[] bytes = new byte[1024];

            while((i = fis.read(bytes)) != -1){
                zos.write(bytes,0,i);
            }
            fis.close();
        }
    }

解压文件

解压文件就麻烦很多 - - 刚开始看的时候有点晕 多看几遍就看懂了


	public static void unzip(){
        //压缩文件的上级目录
        String url = "C:"+File.separator+"Users"+File.separator+"Administrator"+File.separator+"Desktop"+File.separator+"日常文件"+File.separator+"IO流及File"+File.separator+"ZipStream"+File.separator;

        File file = new File(url+"picture.zip") ; // 定义压缩文件

        File outFile = null;        // 输出文件的时候要有文件夹的操作

        ZipFile zipFile = null;         // 实例化ZipFile对象
        try {
            zipFile = new ZipFile(file);
        } catch (IOException e) {
            new FileNotFoundException("找不到该文件");
        }

        ZipInputStream zipInput = null ; // 定义压缩输入流

        OutputStream out = null ;        // 定义输出流,用于输出每一个实体内容

        InputStream input = null;        // 定义输入流,读取每一个ZipEntry

        ZipEntry entry = null ;          // 每一个压缩实体

        try {
            zipInput = new ZipInputStream(new FileInputStream(file));    // 实例化ZIpInputStream

            while ((entry = zipInput.getNextEntry()) != null) {    // 得到一个压缩实体
                System.out.println("解压缩" + entry.getName() + "文件");
                outFile = new File(url + entry.getName());    // 定义输出的文件路径

                if(entry.isDirectory()){
                    outFile.mkdir();
                    continue;
                }

                try {
                    input = zipFile.getInputStream(entry);    // 得到每一个实体的输入流
                    out = new FileOutputStream(outFile);    // 实例化文件输出流
                    int i = 0;
                    byte[] bytes = new byte[1024];
                    while ((i = input.read(bytes)) != -1) {
                        out.write(bytes,0,i);
                    }
                }finally {
                    myClose(out,input); // 关闭输入输出流
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        	myClose(null,zipInput); // 关闭输入输出流
        }

    }

最后是个关闭流的方法


	public static void myClose(OutputStream os,InputStream is){
        if(os != null ){
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if(is != null){
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

好了 基本就这些了。第一次使用,如有使用不当,请指出 我来修改

原文地址为 :https://blog.csdn.net/u013087513/article/details/52151227

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值