炼虚期简介创建思想
炼虚期主要阐述的是文件的压缩与解压的IO操作
提供完整代码,代码在筑基期中
博主空间https://blog.csdn.net/JOElib?spm=1011.2266.3001.5343
文章图片
https://blog.csdn.net/JOElib?spm=1011.2266.3001.5343化神期??????
文章图片
https://blog.csdn.net/JOElib/article/details/123948498?spm=1001.2014.3001.5501元婴期
文章图片
https://blog.csdn.net/JOElib/article/details/123913609?spm=1001.2014.3001.5501
- 压缩操作
- 创建对应的输入流,将所想要压缩的文件输入到内存中
- 调用对应的压缩方法,获取压缩后的byte[]数组
- 通过输出流将byte[]数组和对应的哈夫曼编码表还有最后一个读取位数输出
- 解压操作
- 创建对应的输入流,将所想要解压的文件输入到内存中
- 调用对应的解压方法,获取解压后的byte[]数组
- 通过输出流将byte[]数组输出到对应的为止
public class HuffmanCode implements Serializable {@Serial
private static final long serialVersionUID = 4420;
}
代码分析:
- 实现Serializable接口的目的是为了接下来的序列化和反序列化
- 序列化版本号最好自定义,不要让系统自动分配
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();
}
}
代码分析:
- 参数列表
- strcPath为所需要压缩的文件路径
- 文件压缩后的目标输出路径
- 注意:try()为Java新特性,可以将流进行自动的关闭,不需要手动关闭
- fis,字节输入流,用于输入所需要压缩的文件
- fos,字节输出流,用于作为oos的节点流
- oos,对象输出流,用于输出压缩后的byte[]数组对象
- 通过调用available()方法,获取文件字节数目,从而得到对应byte[]数组的长度
- 调用压缩方法,获取压缩后的数组
- 输出:
- 输出对应的压缩后的byte[]数组,是内容的主体
- 输出哈夫曼编码表(如果不输出哈夫曼编码表,下次解压的时候就无法解压了)
- 输出最后一次读取的字符串长度即哈夫曼编码长度
- 注意:这里为什么要用序列化的方式呢?原因是如果我们用字节输出流直接输出,当我们下一次解压的时候,必定存在对压缩后的文件进行输入,那么系统如何分辨谁是哈夫曼编码表对应的byte[] 还是压缩后的主体byte[]呢?所以用序列化的方法能有效解决该问题
- 调用对应的flush()方法,以及异常捕捉
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)ois.readObject();
lastCount = (int)ois.readObject();
var content = decode(huffmanBytes,huffmanCodes);
fos.write(content);
fos.flush();
}catch (Exception e) {
e.printStackTrace();
}
}
代码分析:
- 参数列表:
- zipPath压缩包的路径
- desPath解压后需要存放的路径
- try()流的讲解
- fis,字节输入流,用于ois的节点流
- ois,对象输入流,用于反序列化byte[]数组对象
- fos字节输出流,用于输出解压后的文件
- 利用反序列化一个对象的特征,我们通过三次反序列化,就可以将三个对象有效区分,即我们可以精准的得到对应的对象,
- 注意:如何进行序列化,就要如何进行反序列化,否则获取的对象有误(文件指针的作用)
- 注意:严格的写法向下转型时需要instanceof,博主偷懒,没写
- 输出解压后的文件
- 调用flush()方法以及异常捕捉
- 必须严格遵守以上序列化和反序列化对象的个数,不可以缺少,如果缺少了就会导致异常或者解压不成功
文章图片
文章图片
效果
文章图片
解压后
文章图片
结论:
【数据结构|winRAR真难用,我决定自创一个(炼虚期) 文件的压缩与解压 将色色一网打尽】大家伙学会了吗,本系列博客已经结束了喔,希望小伙伴们学有所成,如果有任何的不懂可以随时找我哦
推荐阅读
- java|2021年蓝桥杯b组省赛真题
- 蓝桥杯|【蓝桥真题】三十块的蓝桥省赛模拟真题
- 备战蓝桥|【备战蓝桥,冲击省一】高精度算法实现加减乘除
- 备战蓝桥|备战蓝桥,冲击省一 进制转换 你不会还不会吧()
- 备战蓝桥|备战蓝桥,冲击省一 二分查找法 看完你就会了
- 备战蓝桥|【2021年蓝桥省赛真题】赛前最后冲刺,省一我来啦
- 数据结构|每日一学丨Redis 面霸篇(从高频问题透视核心原理)
- java工程师面试篇|进阿里了——分享一波进大厂经验
- 数据库|殃及池鱼!Redis挂了的情况下流量把数据库也打挂了,怎么办()