一:思路
由于用java中的.read()方法读文件返回值是一个0-255之间的数,因此记录下每一个数字出现的频率并将它作为权值就可构建一棵哈夫曼树,根据构建的哈夫曼树我们获得相应字符的编码,然后通过将二进制8位一组转换成一个字符存储,这样就可以使空间变为2进制码文件的1/8,但是由于二进制本身就将文件扩大,因此压缩不是很理想。大约压缩40%-60%;。
二:遇到的问题
1:压缩之后存入的实际上是二进制转换成的字符,但是比如00000111转换成7对应的字符,但是在读出来的时候我开始用Integer.toBinaryString();方法,始终有问题,最终解决是自己写了个转换方法,将它按8位处理,不够补0。
2:接着上一个问题,前面的8位一组全部都可以处理,但是如果最后余不足8位,要是还将它转换成一个字符,这样读出来要是遇到上面的问题就不知道应该还原多少位了,最后我将他们单独存入了另一个文件。
三:改进的地方
1:自己的压缩文件没有将哈夫曼树的值记录进压缩文件,因此压缩与解压缩都在一个程序。
2:算法的问题导致压缩率不是很高。(能否用些高级数据结构或者其他提高压缩率?)
源代码:点这里