操作Zip压缩文件,即Zip压缩包的“读操作“和”写操作“

1.1 读操作

1.1.1 理论

  • 定义上:ZipInputStream流是FilterInputStream的间接子类,可以说明它是""装饰流“,即在FileInputStream的基础上增加了某种逻辑得到了新的功能。

  • 形式上: 和其他“装饰流”一样,创建它的实例时,需要传入一个InputStream的子类作为参数,这也证实了它是在InputStream的基础上添加某种功能

  • 特殊方法:getNextEntry() -> 可以返回一个ZipEntry类型的变量,该返回值拥有多个方法,可以得到你所需的内容。

  • 实现“读”的理论基础:压缩包的读取,可以把压缩包里的文件看作一个一个ZipEntry类,把压缩包里的ZipEntry对象遍历出来即就是把文件读取出来了

  • “读“操作的流程:创建ZipInputStream流,给出目标压缩包 -> 循环遍历出ZipEntry对象 -> 从ZipEntry对象中获取内容

1.1.2 代码实现

public class Test01 {
    public static void main(String[] args) {
        //1.创建ZipInputStream实例,在实例化时传入拥有目标文件的文件输入流参数
        try (ZipInputStream zip = new ZipInputStream(new FileInputStream("d:\\story2.zip"))){
            //2.在外部定义该类可以扩大作用域
            ZipEntry entry = null;
            //3.循环遍历出压缩包里的entry,如果遍历结束返回null
            while((entry = zip.getNextEntry()) != null) {
                //4.获取文件名称
                String name = entry.getName();
                //5.判断该entry是否为文件夹,如果不是则遍历内容
                if(!entry.isDirectory()) {
                    int n;
                    while((n = zip.read()) != -1) {
                        System.out.print((char)n);
                    }
                }
            }
        }  catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

1.2 写操作

1.2.1 理论

  • 实现“写操作”的流程:

创建压缩输出流对象 -> 遍历出原始目录下的子文件 -> 使用putNextEntry()方法将每个子文件包装成ZipEntry类型放入到压缩输出流对象 -> 将原文件的字节内容,写入zip压缩包 -> 结束当前zipEntry

1.2.3 代码实现

public class Test01 {
    public static void main(String[] args) {
        //原始目录
        File rootDir = new File("d:\\picture");
        //将原始目录中的文件,“写入”zip压缩文件
        try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(rootDir.getParent() + "\\" + rootDir.getName() + ".zip"))) {
            //获取并遍历原始目录下的子文件按列表
            File[] files = rootDir.listFiles();
            for (File file : files) {
                //创建一个zipEntry
                out.putNextEntry(new ZipEntry(file.getName()));
                //将原文件的字节内容,写入zip压缩
                out.write(Files.readAllBytes(file.toPath()));
                //结束当前zipEntry
                out.closeEntry();
                
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
​
    }
}
  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值