今天下午,我在华信学习了哈夫曼算法解压文件的前两步。
在这之前记录了压缩文件时候的编码码表的长度和内容。
然后在解压文件时候读取码表内容,就可以知道码表了,再用码表来解读压缩文件的内容就可以还原文件了。
压缩文件时写入码表长度和内容如下代码:
//1.把码表的存储长度写入文件
String str = "";
for(int i=0;i<codestr.length;i++){
fos.write(codestr[i].length());
fos.flush();
}
//2.把码表内容写入文件
while(str.length()>=8){
String strNew = str.substring(0,8);
fos.write(StringToInt(strNew));
fos.flush();
str = str.substring(8);
}
读取压缩文件的码表长度和码表内容代码如下:
//读取前面文件256个字节的长度
public void readlength(FileInputStream fis) throws Exception{
for(int i=0;i<256;i++){
int v = fis.read();
codeth[i] = v;
}
}
//读取码表,读入程序中
public void readCodeTable(FileInputStream fis)throws Exception{
//先读取一个字节
int value = fis.read();
//将value转化为01串
String str = IntToString(value);
int count = 0;
while(count<256){
if(codeth[count]<=str.length()){
String strNew = str.substring(0,codeth[count]);
codestr[count] = strNew;
str = str.substring(codeth[count]);
}else{
value = fis.read();
str = str + IntToString(value);
continue;
}
count++;
}
for(int i=0;i<codestr.length;i++){
System.out.println(i+"的编码为:"+codestr[i]);
}
}
其中涉及到了一个int型转化为字符串的方法:
//int型转化为字符串
public String IntToString(int value){
String str = "";
for(int i=0;i<8;i++){
if(value%2==0){
str = "0" + str ;
}else{
str = "1" + str ;
}
value = value/2;
}
return str;
}
码表成功的转入了解压程序中了,结果如下图:
这就是今天学习的成果,哈夫曼算法压缩解压文件挺不容易的,加油!