package lesson4; import java.io.IOException; public class HuffmanDecode{ //定义一个数组变量来存放各个字节数据对应的编码 private Code SaveCode[]=new Code[256]; private String path; /** * 构造方法 * @param path */ public HuffmanDecode(String path){ this.path=path; } /** * 将一个int转为8个字符的String * @param n * @return */ public String IntToString(int n){ int on=n; String s=""; for (int i=0;i<8;i++){ if ((on % 2)==0){ s='0'+s; }else if(on%2==1){ s='1'+s; } on=on/2; } return s; } /** * 判断哪一个编码是和ss编码匹配的 * @param ss 待匹配字串 * @return 字节为i的编码 */ public int equalsMB(String ss){ for (int i=0;i<256;i++){ if ((SaveCode[i].n)==ss.length()&&(SaveCode[i].node.equals(ss))){ return i; } } return -1; //没有找到匹配的 } /** * 逐位进行比较,判断多少长度的int匹配字符串s * @param s * @return */ public int search(String s){ int n; String ss=""; int num=-1; for (n=0;n<s.length();n++){ ss=ss+s.charAt(n); num=equalsMB(ss); if (num>=0){ break; } } if(n<s.length()){ return num; }else{ return -1; } } /** * 解压缩 */ public void Decode(){ try{ //文件输入流 java.io.FileInputStream fis=new java.io.FileInputStream(path); //读入文件中的每一个编码的长度 for (int i=0;i<256;i++){ Code hC=new Code(); hC.n=fis.read(); hC.node=""; SaveCode[i]=hC; } System.out.println("编码长度读取完毕"); int i=0; int count=0; String coms=""; //读SaveCode中0~256字节的的数据 while (i<256){ //当缓存区的编码长度比编码[i]的长度长的时候 if (coms.length()>=SaveCode[i].n){ for (int t=0;t<SaveCode[i].n;t++){//SaveCode[i].node取得该编码 SaveCode[i].node=SaveCode[i].node+coms.charAt(t); } //把coms前这几位去掉 String coms2=""; for (int t=SaveCode[i].n;t<coms.length();t++){ coms2=coms2+coms.charAt(t); } coms=""; coms=coms2;//累计的下一个编码,继续的使用 i++; }else{ //如果已经没有写出的话,再度入一个byte转化为01 String coms=coms+IntToString(fis.read()); } } //定义文件输出流 String path2 = "";//去掉文件名 尾的stzip后缀 for(int k=0;k<path.length()-6;k++) path2=path2+path.charAt(k); java.io.FileOutputStream fos=new java.io.FileOutputStream(path2); String rsrg;//存转换成的Sting String compString="";//存要比较的字符串 //读入文件,写出文件 while(fis.available()>1){ if (search(compString)>=0){ int cint=search(compString); fos.write(cint); //删掉前n个数据 String compString2=""; for (int t=SaveCode[cint].n;t<compString.length();t++){ compString2=compString2+compString.charAt(t); } compString=""; compString=compString2; }else{//继续读入 compString=compString+IntToString(fis.read()); } } //处理最后一个字节 int cint=fis.read(); String compString2=""; for (int t=0;t<compString.length()-cint;t++){ compString2=compString2+compString.charAt(t); } compString=compString2; //删掉前n个数据 while (compString.length()>0){ int ccint=search(compString); fos.write(ccint); compString2=""; for (int t=SaveCode[ccint].n;t<compString.length();t++){ compString2=compString2+compString.charAt(t); } compString=""; compString=compString2; } System.out.println("解码完毕!"); }catch(Exception ef) { ef.printStackTrace(); } } }