Huffman编码实现文本文件压缩

本文介绍了如何使用Huffman编码实现文本文件的压缩和解压。首先读取文件并计算字符权重,然后构建Huffman树,为每个字符生成编码。压缩过程包括将文本转换为"0101"字符串并写入文件。解压时,依据压缩时的规则逆向操作,还原文本。整个过程结合Java实现了一个简单的文本压缩软件。
摘要由CSDN通过智能技术生成

压缩过程

        压缩过程用了五个方法进行实现,下面依次沿着五个方法介绍下思路以及关键的实现点。

 

1.读取文件,计算文本中字符出现的权重

        我们知道Huffman树的叶子节点是代表权重的,叶子节点的权重越大,那该叶子节点离根节点的距离就越短,对应的字符出现的频率就会越高,这样就能实现压缩。因此实现压缩的第一步要用输入流读取文本文件,并计算出不同字符出现的比例。

        IO读取文本文件:

        方法有很多,可以用字符流,字节流或者用缓冲流一行一行读。BufferReader中readLine()去读的时候,当文本中遇见\r\n时视作一行,这样读取程序执行效率高,但是读取过程中并没有记录\r\n符号的位置,会导致解压时文本无法恢复原状。因此我这里我考虑用字符流读取文本文件。

        计算权重:

        统计权重可以利用hashmap,hash桶上检索效率O(1)和key唯一的特性,将字符与其出现的数目以Character=Integer高效计算权重。

        //File aim,FileReader fr
        long textLength=aim.length();
        //创建hashmap存储字符出现的权重
        charWeightTable=new HashMap<Character,Integer>((int)textLength);
        reader=new char[(int)textLength];
        try {
            fr=new FileReader(aim);
            //一此全读到char数组里
            fr.read(reader);
            //char放入权重哈希表中,统计权重
            for (int i = 0; i < reader.length; i++) {
                if(reader[i]!='\u0000') {
                    if (charWeightTable.containsKey(reader[i])) {
                        int count = charWeightTable.get(reader[i]);
                        charWeightTable.put(reader[i], ++count);
                    } else {
                        charWeig
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值