最近遇到文件压缩的作业,要求如下:
输入:一个文本文件
输出:压缩完的二进制文件
压缩过程(不对哈夫曼编码原理进行详细解释):
1:读取文件内容到StringBuffer中,并使用hashmap统计每个字符出现的频率,按字符出现的频率升序排序(并保存在文件,备解压使用)。
2:对排序结束的字符频率建立哈弗曼树。
3:遍历哈弗曼树获得每个字符的编码,字符和对应的编码保存在hashmap中。
4:将源文件的内容按字符遍历一遍,获取字符编码后的内容(一串01串)。
5:每8位切割转换成int写入压缩文件(末尾不足8位补0)。
解压过程(需要借助字符频率统计的文件):
1:读取字符频率统计文件,重建哈弗曼树。
2:读取压缩文件,每次读取int,进而转换成二进制。
3:转换后的二进制串在重建的哈夫曼树上遍历,找到对应的字符。
实现完整源代码(java)包括两个运行实例见 http://download.csdn.net/download/u014594922/10152447
这样的初步实现还很不完善,后续需要考虑将编码信息保存在压缩的文件头中,解压就不需要字符频率文件了。