文件解压和压缩io流

  • 参考
  • https://www.cnblogs.com/lrh-xl/p/5509005.html
  • https://www.wenjiangs.com/search?word=ZipEntry
  • java.util.zip
    文件的压缩和解压,主要用到了两个IO流-ZipInputStream, ZipOutputStream,不仅可以对文件进行压缩,还可以对文件夹进行压缩和解压。
    ZipInputStream位于java.util.zip包下。
    -先上示例在详解
// 将文件压缩
File file = new File("D:\\io\\zip\\hah.doc");
        File file1 = new File("D:\\io\\zip\\bbb.docx");
        File file2 = new File("D:\\io\\zip\\test.zip");

        //创建文件输入流
        FileInputStream fileinput = new FileInputStream(file1);
        //开启缓存流
        BufferedInputStream bufferedinput = new BufferedInputStream(fileinput);
        //创建一个文件输出流
        FileOutputStream fileout = new FileOutputStream(file2);
        //创建一个压缩输出流
        ZipOutputStream zipout = new ZipOutputStream(fileout);
        //开启输出缓存
        BufferedOutputStream bufferedout = new BufferedOutputStream(zipout);
        /**putNextEntry开始编写新的ZIP文件条目,并将流定位到条目数据的开头。 如果仍然有效,
         *   则关闭当前条目。
            如果没有为条目指定压缩方法,则将使用默认压缩方法,
            如果条目没有设置修改时间,则将使用当前时间。
         ZipEntry()表示ZIP文件条目。
         setComment() 方法为条目设置可选的注释字符串。
        */
        zipout.putNextEntry(new ZipEntry("bbb.docx"));
        byte[] bytes = new byte[1024];
        while (true){
            int read = bufferedinput.read(bytes);
            if(read == -1){
                break;
            }
            bufferedout.write(bytes,0,read);
        }
        //关闭缓存流
        bufferedinput.close();
        bufferedout.close();
  • 目录压缩
package com.kuangsheng.mybatis_plus.test;

import java.io.*;
import java.math.BigDecimal;
import java.net.SocketTimeoutException;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TreeSet;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Test  {
    public static void main(String[] args) throws IOException {
        //这个示例是将目录压缩
        File file = new File("D:\\io\\demo");

        File file1 = new File("D:\\io\\zip\\bbb.docx");
        File file2 = new File("D:\\io\\demo.zip");

        //创建压缩输出流 意思就是设置终点
        ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream(file2));

        //判断数据源是不是一个目录
        if(file.isDirectory()){
            //获取目录下中所有的文件
            File[] files = file.listFiles();
            //遍历目录下所有文件变成流哈
            for(int a=0;a<files.length;a++){
                //获取源文件数据哈
                BufferedInputStream bufferedinput = new BufferedInputStream(new FileInputStream(files[a]));
                /**ZipOutputStream.putNextEntry(ZipEntry e)方法开始编写新的ZIP文件条目,
                 并将流定位到条目数据的开头。 如果仍然有效,则关闭当前条目。
                 如果没有为条目指定压缩方法,则将使用默认压缩方法,如果条目没有设置修改时间,则将使用当前时间。
                 java.util.zip.ZipEntry类用于表示ZIP文件条目
                 File.separator 的作用相当于 ' \  '
                 下面就是设置压缩流的里面的目录和文件
                 */
                zipout.putNextEntry(new ZipEntry(file.getName()+file.separator+files[a].getName()));
                byte[] bytes = new byte[1024];
                while (true){
                    int read = bufferedinput.read(bytes);
                    if(read== -1)
                        break;
                    zipout.write(bytes,0,read);
                }
                //关闭流
                bufferedinput.close();
            }
        }
        //关闭流
        zipout.close();


    }
}

  • 压缩包解压
package com.kuangsheng.mybatis_plus.test;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;

public class ZipDemo {
    public static void main(String[] args) throws IOException {
        /** 文件解压
         *   使用的流 ZipInputStream(inputstream,charset)和Zipoutputstream()
         *  java.util.zip.ZipFile类用于从 ZIP 文件读取条目。
         *  即从给定的ZIP压缩文件中获取所有文件的信息,
         *  如:文件的名称、是否为目录等信息。可以使用这个类来实现将zip文件进行解压操作。
         *  ZipEntry 类用于表示 ZIP 文件条目。
         *  ZipInputStream.getNextEntry()方法读取下一个ZIP文件条目并将该流定位在条目数据的开头。
         *  下一个ZIP文件条目,如果没有更多条目,则返回null。
         *  getParentFile()的作用是返回此抽象路复径名父目录的抽象路径名。
         *  getParentFile()的作用是获得父目录
         *  boolean mkdir() 
         *   创建此抽象路径名指定的目录。 
         *  boolean mkdirs() 
         *   创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。
         * 也就是说,mkdir只能创建一层目录,而mkdirs可以创建多层。
         */
        //数据源就是压缩包
        File file = new File("D:\\io\\demo.zip");

        //压缩包类
        ZipFile zipFile = new ZipFile(file);
        //将压缩包创建成压缩包流
        ZipInputStream zipInput = new ZipInputStream(new FileInputStream(file));
        //创建存放数据的对象,
        ZipEntry entry = null;
        while((entry=zipInput.getNextEntry())!= null){
            System.out.println("源文件"+entry.getName());
            //创建目的地
            File outputfile = new File("D:\\io\\good\\"+entry.getName());
            System.out.println(outputfile.getParentFile().exists());
            if(!outputfile.getParentFile().exists()){
                outputfile.getParentFile().mkdirs();
            }
            System.out.println(outputfile.getParentFile().exists());
            if(!outputfile.exists()){
                outputfile.createNewFile();
            }
            //用缓存流来传输数据
            BufferedInputStream bufferedinput = new BufferedInputStream(zipFile.getInputStream(entry));
            BufferedOutputStream bufferedoutput = new BufferedOutputStream(new FileOutputStream(outputfile));
            byte[] bytes = new byte[1024];
            while(true){
                int len = bufferedinput.read(bytes);
                if(len ==-1)
                    break;
                bufferedoutput.write(bytes,0,len);
            }
            //关闭流
            bufferedinput.close();
            bufferedoutput.close();
        }
        zipInput.close();

    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值