目录

文件压缩与解压(赫夫曼编码)

目录

在赫夫曼编码的文章里我们学习了对字符串进行编码和解码操作,下面来对文件进行压缩和解压。主要是多了一些文件流的操作。

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.eh.ftd.dsa.ds;

import java.io.*;

/**
 * 赫夫曼编码文件压缩处理工具
 *
 * @author David Li
 * @create 2020/06/28 22:31
 */
public class HuffmanFileCompressUtils {
    /**
     * 压缩文件
     *
     * @param srcFilePath  源文件
     * @param destFilePath 压缩后的目标文件
     */
    public static void zip(String srcFilePath, String destFilePath) {

        try {
            // 读取文件到byte数组,这里粗暴一点
            FileInputStream fis = new FileInputStream(srcFilePath);
            byte[] b = new byte[fis.available()];
            fis.read(b);
            // 压缩
            HuffmanEncode.HuffmanEncodeResult huffmanEncodeResult = HuffmanEncode.encode(b);
            byte[] zip = huffmanEncodeResult.getData();
            String key = huffmanEncodeResult.getKeyJson();
            // 使用对象流存储,之后解压好处理
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(destFilePath));
            oos.writeObject(zip);
            oos.writeObject(key);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("压缩成功!");
    }

    /**
     * 解压文件
     *
     * @param srcFilePath  压缩文件
     * @param destFilePath 解压后的文件
     */
    public static void unzip(String srcFilePath, String destFilePath) {
        try {
            // 读取压缩文件
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(srcFilePath));
            byte[] zipData = (byte[]) ois.readObject();
            String key = (String) ois.readObject();
            // 解压
            byte[] b = HuffmanDecode.decode(zipData, key);
            // 写到目标文件
            FileOutputStream fos = new FileOutputStream(destFilePath);
            fos.write(b);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("解压成功!");
    }

    public static void main(String[] args) {
        // 压缩图片
        zip("/Users/david/my/picture/test/src.png", "/Users/david/my/picture/test/src.zip");
        // 解压图片
        unzip("/Users/david/my/picture/test/src.zip", "/Users/david/my/picture/test/dest.png");
    }
}

运行结果 https://gitee.com/lienhui68/picStore/raw/master/null/20200628235734.png