【数算-24】压缩文件【赫夫曼树实际应用】
发布日期:2021-05-07 08:58:03 浏览次数:22 分类:精选文章

本文共 3255 字,大约阅读时间需要 10 分钟。

文章目录

1、问题描述

在这里插入图片描述

2、压缩文件

1、代码实现

/**     * @param src 文件源路径     * @param dst 文件目标路径     * @Method zipFile     * @Author zhihua.Li     * @Version 1.0     * @Description 对文件进行赫夫曼压缩     * @Return void     * @Exception     * @Date 2021/2/27 20:21     */    private void zipFile(String src, String dst) {           FileInputStream is = null;        FileOutputStream os = null;//        初始化对象输出流        ObjectOutputStream oos = null;        try {   //		  通过文件输入流读入文件数据            is = new FileInputStream(src);//            is.available()方法用来统计数据流中可读取的字节总数//            这里用来创建一个和源文件大小相同的字符数组            byte[] b = new byte[is.available()];//            读取文件            is.read(b);//            直接对源文件进行压缩,使用上节中的整合方法,对传入的原始字符数组进行压缩,转换为压缩后的赫夫曼字符数组            byte[] huffmanBytes = HuffmanZip(b);//			新建文件输出流            os = new FileOutputStream(dst);            oos = new ObjectOutputStream(os);//			将压缩后的字符数组写出            oos.writeObject(huffmanBytes);//          将赫夫曼编码表写出            oos.writeObject(huffmanCodes);        } catch (Exception e) {               e.printStackTrace();        } finally {   //		 	关闭流            try {                   oos.close();                os.close();                is.close();            } catch (Exception e) {                   e.printStackTrace();            }        }    }

2、代码测试

@Test    public void test2(){           String src = "d://test.jpg";        String srcZip = "d://img.zip";        zipFile(src,srcZip);        System.out.println("压缩成功!");

在这里插入图片描述

注意:这里并不能直接通过解压工具对压缩文件进行解压,如果需要解压还需要赫夫曼编码的解码过程对其进行解压操作才能实现无损还原

3、解压文件

1、代码实现

/**     * @Method fileDecode     * @Author zhihua.Li     * @Version  1.0     * @Description     * @param zipFile   准备解压的文件     * @param dst       解压后的目标位置     * @Return void     * @Exception     * @Date 2021/2/27 21:23     */    private void fileDecode(String zipFile,String dst){           FileInputStream is = null;        ObjectInputStream ois = null;        FileOutputStream os = null;        try {           	//	将经过赫夫曼编码压缩后的文件进行读取            is = new FileInputStream(zipFile);            //	使用对象流输入进行读取,可以直接读取到输入流中的对象            ois = new ObjectInputStream(is);            //	读取到压缩过程中首先存入的压缩后的字符数组            byte[] huffmanBytes = (byte[])ois.readObject();            //  读取压缩过程中存入的赫夫曼编码map            Map
huffmanCodes = (Map
) ois.readObject(); // 通过上节中的解压过程,根据赫夫曼编码map对压缩后的字符数组进行解压 byte[] srcBytes = decode(huffmanCodes, huffmanBytes); // 创建文件输出流,输出到目标文件 os = new FileOutputStream(dst); // 将解码后的原字符数组写出到目标文件中 os.write(srcBytes); } catch (Exception e) { e.printStackTrace(); }finally { // 关闭流 try { os.close(); ois.close(); is.close(); }catch (Exception e){ e.printStackTrace(); } } }

2、代码测试

@Test    public void test2() {           String src = "d://test.jpg";        String srcZip = "d://img.zip";        String dst = "d://destination.jpg";        zipFile(src, srcZip);        System.out.println("压缩成功");        fileDecode(srcZip,dst);        System.out.println("解压成功");	}

结果为:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、注意

只有当原文件中重复数据越多或字符重复频率越高时,压缩效率越高

反之,压缩效果可能并不明显甚至超出原文件大小(因为会额外保存赫夫曼编码的Map)

上一篇:JSP:简单购物车
下一篇:JSP内置对象:操作cookie、session对象

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月10日 10时10分51秒