winRAR真难用,我决定自创一个(炼虚期) 文件的压缩与解压 将色色一网打尽

news/2024/10/18 22:34:34/

  炼虚期简介

炼虚期主要阐述的是文件的压缩与解压的IO操作

提供完整代码,代码在筑基期中     

博主空间https://blog.csdn.net/JOElib?spm=1011.2266.3001.5343https://blog.csdn.net/JOElib?spm=1011.2266.3001.5343化神期​​​​​​https://blog.csdn.net/JOElib/article/details/123848806?spm=1001.2014.3001.5501元婴期https://blog.csdn.net/JOElib/article/details/123913609?spm=1001.2014.3001.5501


创建思想🐼

  1. 压缩操作
    1. 创建对应的输入流,将所想要压缩的文件输入到内存中
    2. 调用对应的压缩方法,获取压缩后的byte[]数组
    3. 通过输出流将byte[]数组和对应的哈夫曼编码表还有最后一个读取位数输出
  2. 解压操作
    1. 创建对应的输入流,将所想要解压的文件输入到内存中
    2. 调用对应的解压方法,获取解压后的byte[]数组
    3. 通过输出流将byte[]数组输出到对应的为止

代码实现与分析🐼 

1.哈夫曼类实现标志接口Serializable🐻

public class HuffmanCode implements Serializable {@Serialprivate static final long serialVersionUID = 4420;}

代码分析:🐨

  1. 实现Serializable接口的目的是为了接下来的序列化和反序列化
  2. 序列化版本号最好自定义,不要让系统自动分配 

2.创建对应的压缩方法🐻 

 public static void fileZip(String srcPath,String desPath) {try(var fis = new FileInputStream(srcPath);var fos = new FileOutputStream(desPath);var oos = new ObjectOutputStream(fos)) {var content = new byte[fis.available()];fis.read(content);byte[] huffmanBytes = huffmanCodeZip(content);oos.writeObject(huffmanBytes);oos.writeObject(HUFFMAN_CODES);oos.writeObject(lastCount);oos.flush();fos.flush();}catch (Exception e) {e.printStackTrace();}}

代码分析:🐨 

  1. 参数列表
    1. strcPath为所需要压缩的文件路径
    2. 文件压缩后的目标输出路径
  2. 注意:try()为Java新特性,可以将流进行自动的关闭,不需要手动关闭
    1. fis,字节输入流,用于输入所需要压缩的文件
    2. fos,字节输出流,用于作为oos的节点流
    3. oos,对象输出流,用于输出压缩后的byte[]数组对象
  3. 通过调用available()方法,获取文件字节数目,从而得到对应byte[]数组的长度
  4. 调用压缩方法,获取压缩后的数组
  5. 输出:
    1. 输出对应的压缩后的byte[]数组,是内容的主体
    2. 输出哈夫曼编码表(如果不输出哈夫曼编码表,下次解压的时候就无法解压了)
    3. 输出最后一次读取的字符串长度即哈夫曼编码长度
    4. 注意:这里为什么要用序列化的方式呢?原因是如果我们用字节输出流直接输出,当我们下一次解压的时候,必定存在对压缩后的文件进行输入,那么系统如何分辨谁是哈夫曼编码表对应的byte[] 还是压缩后的主体byte[]呢?所以用序列化的方法能有效解决该问题
  6. 调用对应的flush()方法,以及异常捕捉

3.创建对应的解压方法🐻 

public static void fileDeZip(String zipPath,String desPath) {try(var fis = new FileInputStream(zipPath);var ois = new ObjectInputStream(fis);var fos = new FileOutputStream(desPath)) {var huffmanBytes = (byte[])ois.readObject();var huffmanCodes = (Map<Byte,String >)ois.readObject();lastCount = (int)ois.readObject();var content = decode(huffmanBytes,huffmanCodes);fos.write(content);fos.flush();}catch (Exception e) {e.printStackTrace();}}

代码分析:🐨 

  1. 参数列表:
    1. zipPath压缩包的路径
    2. desPath解压后需要存放的路径
  2. try()流的讲解
    1. fis,字节输入流,用于ois的节点流
    2. ois,对象输入流,用于反序列化byte[]数组对象
    3. fos字节输出流,用于输出解压后的文件
  3. 利用反序列化一个对象的特征,我们通过三次反序列化,就可以将三个对象有效区分,即我们可以精准的得到对应的对象,
    1. 注意:如何进行序列化,就要如何进行反序列化,否则获取的对象有误(文件指针的作用)
    2. 注意:严格的写法向下转型时需要instanceof,博主偷懒,没写
  4. 输出解压后的文件
  5. 调用flush()方法以及异常捕捉

3.要点:🐻 

  1. 必须严格遵守以上序列化和反序列化对象的个数,不可以缺少,如果缺少了就会导致异常或者解压不成功 

4.演示🐻 

 效果

解压后


结论:🐼

        大家伙学会了吗,本系列博客已经结束了喔,希望小伙伴们学有所成,如果有任何的不懂可以随时找我哦 


http://www.ppmy.cn/news/901111.html

相关文章

gradle的下载、解压、环境变量配置以及命令行基本用法

父目录 Android 开发入门 - wuyujin1997 文章目录 Intro下载解压配置环境变量环境变量测试 命令行命令行基本用法命令行更多用法 Intro 关于Java项目的依赖、编译流程等管理&#xff0c;有三代的解决方案。 AntMavenGradle 可以想像这三代工具必定是各有特定&#xff0c;但整…

【C++】C++ 类型转换

文章目录 C类型转换C语言中的类型转换C类型转换的意义C强制类型转换static_castreinterpret_castconst_castdynamic_cast static_cast 静态铸造 reinterpret_cast 重新解释 const_cast 常量铸造 dynamic_cast 动态铸造C类型转换 C与C都是强类型语言&#xff0c;如果…

人机对战-黑白棋

先大致了解一下黑白棋&#xff1a; 规则 如果玩家在棋盘上没有地方可以下子&#xff0c;则该玩家对手可以连下。双方都没有棋子可以下时棋局结束&#xff0c;以棋子数目来计算胜负&#xff0c;棋子多的一方获胜。 在棋盘还没有下满时&#xff0c;如果一方的棋子已经被对方吃光…

BSC 链最受欢迎的竞技游戏 — Thetan Arena

Apr. 2022, Grace Data Source: Footprint Analytics Thetan Arena Dashboard Thetan Arena 是基于区块链的竞技游戏&#xff0c;涵盖了对战、角色扮演、MOBA以及幻想等元素。目前用户数达到了 14 万&#xff0c;是 Footprint Anayltics BSC 游戏排行榜上最受欢迎的竞技游戏…

suparc服务器没信号,SupARC对战平台新手上手教程

11对战平台1.2.8.3 官方最新版 类型&#xff1a;修改器(游戏工具)大小&#xff1a;88.1M语言&#xff1a;中文 评分&#xff1a;9.8 标签&#xff1a; 立即下载 这里有各种版本的SupARC客户端供选择&#xff0c;另外还有很多ROM 客户端下载成功后需要玩家注册新账号 新手玩家需…

三子棋(人机对战)

目录 整体思路&#xff1a; 头文件如下&#xff1a; 为什么要使用头文件呢&#xff1f; 头文件的使用&#xff1a; 游戏主函数如下&#xff1a; 功能实现如下&#xff1a; 注意&#xff1a; 整体思路&#xff1a; 1.创建一个二维数组 2.初始化二维数组 3.打印棋盘 4…

赛事报名启动丨百度Apollo星火自动驾驶大赛开始报名啦!

作为汽车智能化、网联化的关键环节&#xff0c;自动驾驶成为全球科技界、产业界竞争的新赛道。随着人工智能、5G通信、激光雷达、高精地图等多项技术不断完善&#xff0c;自动驾驶的判断力和理解力得到了显著提升。为了推动自动驾驶技术的发展、加快人工智能技术的迭代&#xf…

2022.10.3 模拟赛

T1 frame 还是那个老 t r i c k trick trick 每个数取 log ⁡ \log log 乘法变加法&#xff0c;虽然最后还是要打一个高精。 // 高精的板子 struct Tnum{#define MAX_LEN 30030int len, isnagetive;int num[MAX_LEN];Tnum() { isnagetive 0, len 0; memset(num, 0, sizeof…