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