IO流学习09(Java)

news2024/10/7 10:23:19

解压缩流/压缩流:

解压缩流:

解压本质:把每一个ZipEntry按照层级拷贝到本地另一个文件夹中

注:Java只认zip格式

在正式写之前,先准备好压缩文件和解压完需要存放文件的文件夹

下面直接给出案例:

package com.zhou.myzipstream;

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

public class ZipStreamDemo1 {
    //定义一个方法来解压
    public static void unzip(File src,File dest) throws IOException {
        //创建一个解压缩流用来读取压缩包中的数据
        ZipInputStream zip = new ZipInputStream(new FileInputStream(src));

        // 要先获取到压缩包里面的每一个zipentry对象

        //表示当前在压缩包中获取的文件或文件夹
        ZipEntry entry;
        while((entry = zip.getNextEntry())!=null){
            System.out.println(entry);

            //文件夹:需要在目的地dest出创建一个同样的文件夹
            //文件:需要读取到压缩包中的文件,并把他存放到目的地dest文件夹中(按照层级目录进行存放)
            if(entry.isDirectory()){
                //文件夹:需要在目的地dest处创建一个同样的文件夹
                File file = new File(dest,entry.toString());
                file.mkdirs();
            }else{
                //文件:需要读取到压缩包中的文件,并把它存放到目的地dest文件夹中
                FileOutputStream fos = new FileOutputStream(new File(dest,entry.toString()));
                int b;
                while((b = zip.read())!=-1){
                    //写到目的地
                    fos.write(b);
                }
                fos.close();
                //表示在压缩包中的一个文件处理结束了
                zip.closeEntry();
            }
        }
        zip.close();
    }

    public static void main(String[] args) throws IOException {
        //1.创建一个File表示要解压的压缩包
        File src = new File("D:\\a\\YaSuo.zip");

        //2.创建一个File表示解压的目的地
        File dest = new File("D:\\b");

        //调用方法
        unzip(src,dest);

    }
}

核心就是操作ZipEntry对象,也就是压缩文件中的每一个文件夹或者文件。

ZipInputStream表示解压缩输入流

mkdir()方法用于创建单级目录,如果父级目录不存在则创建失败。

mkdirs()方法用于创建多级目录,如果父级目录不存在则会一并创建。

例如,如果要创建目录“/a/b/c”,使用mkdir()方法需要先创建“/a”和“/a/b”两个目录,而使用mkdirs()方法则可以直接创建“/a/b/c”目录。

总之,mkdir()方法适用于创建单级目录,mkdirs()方法适用于创建多级目录。

运行结果:

 

压缩流: 

压缩单个文件案例:

package com.zhou.myzipstream;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipStreamDemo2 {
    //压缩方法
    public static void toZip(File src,File dest) throws IOException {
        //1.创建压缩流关联压缩包
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest,"js.zip")));
        //2.创建ZipEntry对象,表示压缩包里面的每一个文件夹和文件
        ZipEntry entry = new ZipEntry("js.txt");
        //3.把ZipEntry对象放到压缩包当中
        zos.putNextEntry(entry);
        //4.把src文件中的数据写到压缩包中
        FileInputStream fis = new FileInputStream(src);
        int b;
        while ((b = fis.read())!=-1){
            zos.write(b);
        }
        //5.释放资源
        zos.closeEntry();
        zos.close();


    }

    public static void main(String[] args) throws IOException {
        //1.创建File对象表示要压缩的文件
        File src = new File("D:\\b\\js.txt");
        //2.创建File对象表示压缩包的位置
        File dest = new File("D:\\a");
        //3.调用方法用于压缩
        toZip(src,dest);

    }
}
ZipOutputStream为压缩输出流,关联好压缩包后,因为压缩文件是返回在压缩包里面的,所以光写一个父级路径是不够的,需要在后面加上子路径。

压缩文件夹:

package com.zhou.myzipstream;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipStreamDemo3 {
    public static void main(String[] args) throws IOException {
        //压缩文件夹
        //1.创建File对象表示要压缩的文件夹
        File src = new File("D:\\b\\new");
        //2.创建File对象表示压缩包放在哪里(压缩包的父级路径)
        File destParent = src.getParentFile();//D:\\b
        //3.创建File对象表示压缩包路径
        File dest = new File(destParent,src.getName() + ".zip");
       //4.创建压缩流关联压缩包
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
        //5.获取src里面的每一个文件,变成ZipEntry对象,放入压缩包当中
        toZip(src,zos,src.getName());
        //6.释放资源
        zos.close();
    }

    /*获取到src里面的每一个文件,变成ZipEntry对象,放入压缩包当中
    * 三个参数分别是:数据源、压缩流、压缩包内部的路径*/
    public static void toZip(File src,ZipOutputStream zos,String name) throws IOException {
        //进入src文件夹
        File[] files = src.listFiles();
        //遍历数组
        for(File file : files) {
            if(file.isFile()){
                //判断-文件,变成ZipEntry对象,放入到压缩包中
                ZipEntry entry = new ZipEntry(name + "\\" + file.getName());
                zos.putNextEntry(entry);
                //读取文件中的数据,写到压缩包
                FileInputStream fis = new FileInputStream(file);
                int b;
                while ((b = fis.read()) != -1){
                    zos.write(b);
                }
                fis.close();
                zos.closeEntry();
            }else{
                //判断-文件夹,递归
                toZip(file,zos,name + "\\" + file.getName());
            }
        }

    }
}

listFiles()方法是Java中File类的一个方法,用于返回一个文件夹中所有文件和子文件夹的File对象数组。该方法返回的数组包含指定文件夹中所有文件和子文件夹的File对象,但不包括文件夹本身。如果文件夹不存在或者不是一个文件夹,则返回null。

核心代码是:

ZipEntry entry = new ZipEntry(name + "\\" + file.getName());

如果不这么写,会把D盘放进压缩文件里面。

运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

步进电机的MATLAB仿真程序分享(采用了卡尔曼滤波,对定子电流进行估计,并估算出转子的位置和速度)

两相步进电机的连续时间延长卡尔曼滤波器仿真, 根据定子电流的噪声测量,估计定子电流以及转子位置和速度。 主程序: function MotorKalman % 两相步进电机的连续时间延长卡尔曼滤波器仿真 % 根据定子电流的噪声测量,估计定子电…

为什么InnoDB存储引擎选择使用B+tree索引结构?

🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉欢迎光临🎉🎉🎉🎉🎉&…

CS231W assignment3 RNN

对作业进行一些形象的解释 首先是def rnn_step_forward: 这里的t时刻其实就是一个句子里面的单词数,为了方便会统一到一个最长长度,对于比这个长度短的部分用null进行填充,并且在方法内部会让Null不进行传播和梯度计算。 我们最…

Simpleitk简单应用-python版本

安装: pip install simpletik读取 目前主流的医疗图像格式是nifti格式,相比于dicom格式更加简单和更加容易读取和操作。后缀名为nii或者nii.gz(nii为原格式,gz结尾的是经过压缩格式,因为医疗图像的重复像素特别多,通…

【Hello mysql】 mysql的基本查询(二)

Mysql专栏:Mysql 本篇博客简介:介绍mysql的基本查询 mysql的基本查询(二) 将筛选出来的数据插入到数据库中(insertselect)聚合函数统计班级共有多少同学统计班级手机的qq号有多少统计本次考试去重的数学成绩…

Xcode doesn’t support iPhone’s iOS 15.7.3 (19H307).

Xcode真机调试时,出现了Xcode doesn’t support iPhone’s iOS 15.7.3 (19H307).,Xcode不支持iPhone的版本。升级Xcode太耗时,用了找支持SDK文件方式解决了此问题。下图是本地的SDK支持文件。 从GitHub下载了15.7的设备支持文件&#xff0c…

N-123基于springboot房屋租赁管理系统

开发工具:IDEA,jdk1.8 服务器:tomcat9.0 数据库:mysql5.7 前端:jsp、bootstrap 技术: springbootmybatis-plus 系统主要分前台和后台,分租客、房东、管理员三个角色 系统功能介绍说明&am…

19 动态库和静态库

文章目录 静态库动态库dll模块入口函数 静态库 选择桌面向导里面的静态库 设置为发布版,设置重新生成 创建文件夹放入库和头文件 将库放入工程目录下面 在属性中选择C/C附加包含目录&#xff0c;选择include 属性中链接器选择附加目录将lib选中 #include <stdio.h> #i…

八数码问题-c语言

八数码问题 每个局面是三行三列的数字方阵&#xff0c;每个位置为0-8的一个数码且互不相同&#xff0c;求从初始局面&#xff08;自己设定&#xff09;如何“最快”移动到终止局面&#xff08;自己设定&#xff09;。 移动规则&#xff1a;每次只能0与其上下左右四个方向相邻…

91. 解码方法

91. 解码方法 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 91. 解码方法 https://leetcode.cn/problems/decode-ways/ 完成情况&#xff1a; 解题思路&#xff1a; 参考代码&#xff1a; package 西湖算法题解…

LLM 与架构新纪元:适应代码生成模式,突破软件开发瓶颈

TL;DR 版本&#xff1a; 今年 2 月&#xff0c;我们在 QCon 上分享了《组织级架构治理的正确落地方式》&#xff0c;其背后的一个核心思想是&#xff1a;架构即代码。围绕这个核心思想&#xff0c;我们构建了 ArchGuard 的治理功能&#xff0c;即架构规范转换为代码。 今年 5 月…

【Qt QML入门】Rectangle

Rectangle是用来在QML窗口上绘制一个可带边框、和可填充的矩形局域。 如效果图&#xff1a; QML代码如下&#xff1a; import QtQuick 2.15 import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")//绘制一个可填充的矩…

开源堡垒机Guacamole二次开发记录之一

简介 项目中需要用到堡垒机功能&#xff0c;调研了一大圈&#xff0c;发现了Apache Guacamole这个开源项目。 Apache Guacamole 是一个无客户端的远程桌面网关&#xff0c;它支持众多标准管理协议&#xff0c;例如 VNC(RFB)&#xff0c;RDP&#xff0c;SSH 等等。该项目是Apa…

LabVIEW-模拟传感器采集数据并预测数据

一、题目 已知某传感器过去的一段时间内采集的数据为d1,d2,d3,......,dn&#xff0c;现欲以m点的数据宽度&#xff0c;预测 tao 步后的数据值&#xff0c;即将一维的时间序列数据重构为如下m1列的形式&#xff1a; d(1) d(2 ) ....... d(m), d(mtao) d(2) d(…

Python第一天学习之Python数据类型

1.数据类型介绍 2.数据转换 money 50 money "giao" print(money)Python会进行自动的转换&#xff0c;但是&#xff0c;运算就错误,在赋值时可以直接转换&#xff0c;但是在计算时无法直接转换。 money 50 money "giao" print(money1)数据类型转换 …

OpenSSL安装使用(四):DES加解密功能测试

OpenSSL是一个开放源代码的安全套接字层密码库&#xff0c;它主要用于互联网安全协议的实现&#xff0c;具有加密&#xff0c;认证和安全访问等功能。OpenSSL由Eric Young和Tim Hudson共同开发&#xff0c;源自SSLeay开放源代码密码库&#xff0c;后来和内容安全管理密码库&…

探索基于VSCode的远程开发插件,进行远程指令和本地指令的运行

需求 最近在研究VSCode的插件的时候&#xff0c;使用了VSCode的远程开发套件&#xff0c;Remote - SSH可以在本地的VSCode上登录远程机器&#xff0c;打开远程机器的某个文件夹进行开发。并且在开发过程中&#xff0c;能够使用几乎所有的VSCode插件。 当你使用这个插件链接到远…

Python(三):Python开发环境搭建

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

mybatis 注解方式操作 sql

前言:注解的方式在某些查询的时候还是比较方便的 mybatis注解配置 mapUnderscoreToCamelCase 配置Select 注解Insert 注解Delete 注解 和 Update 注解Provider 注解 mapUnderscoreToCamelCase 配置 别名设置&#xff0c;mapUnderscoreToCamelCase 配置 配置可以将 带下划线 sq…