Java压缩之LZW算法字典压缩与解压讲解

  

<强>压缩过程:

  

前面已经写过一篇哈夫曼压缩,LZW字典压缩与哈夫曼压缩的不同之处在于不需要把编码写入文件,编码表是在读文件中生成的,首先将0 - 255个ASCLL码与对应的数字存入哈希表中,作为基础码表。

  

癑ava压缩之LZW算法字典压缩与解压讲解"

  

这里的后缀为当前

  

前缀+后缀如果在码表中存在,前缀等于前缀+后缀。如果不存在,将前缀+后缀所表示的字符串写入编码表编码,同时将前缀写入压缩文件中。这里重点注意一下,一个字节所能表示的数字范围为0 - 255,所以我们将一个字符的编码变成两个字节写进去,分别写入它的高八位和低八位,比如256即为00000001 11111111这里用到DataOutputStream dos对象中的dos.writeChar(256)方法。

  

两个字节所能表示的范围为0 - 65535。当我们的编码超过这份范围,就需要重置编码表,再重新编码。

  

<>强解压过程

  

癑ava压缩之LZW算法字典压缩与解压讲解"

  

连续波表示读取的到的字符,PW为上一行的连续波(CW再编码表中存在:p→PW, C→CW的第一个字符,输出CW.CW在编码表中不存在,p→PW, C→PW的第一字符输出p + C .

  65535年

当我们读到的时候,就重置码表,重新编码。

  

<强>代码部分

        日本公共类{   私人int bianma=256;//编码   私人公司产品名称字符串=" ";//前缀   私人字符串后缀=" ";//后缀   私人字符串中建=" ";//中间变量   Integer> HashMap<字符串;嗯=new HashMap<字符串,Integer>();//编码表   私有静态字符串路径=" D: \ \ JAVA \ \字典压缩\ \ zidianyasuo.txt”;//要压缩的文件   私有静态字符串path3=" D: \ \ JAVA \ \字典压缩\ \ yasuo.txt”;//解压后的文件   私有静态字符串path4=" D: \ \ JAVA \ \字典压缩\ \ jieya.txt”;//解压后的文件   公共静态void main (String [] args)抛出IOException {/* *   *压缩   */日本日本首相福田=new ();   yasuo.yasuo ();/* *   *解压   */新杰亚杰亚杰=();   jie.jieya (path3 path4);   }   日本公共空间()抛出IOException {//创建文件输入流   InputStream是=new FileInputStream(路径);   byte[]缓冲=new byte [is.available());//创建缓存区域   is.read(缓冲);//读入所有的文件字节   字符串str=新的字符串(缓冲);//对字节进行处理   is.close ();//关闭流//创建文件输出流   OutputStream os=new FileOutputStream (path3);   DataOutputStream dos=new DataOutputStream (os);//System.out.println (str);//把最基本的256个Ascll码放编码表中   for (int i=0;我& lt;256;我+ +){   char ch=(char)我;   字符串圣=ch +“”;   嗯。把(圣,我);   }   for (int i=0;我& lt;str.length ();我+ +){   如果(bianma==65535) {   System.out.println(“重置”);   dos.writeChar(65535);//写出一个1作为重置的表示与码表的打印   hm.clear();//清空Hashmap   for (int j=0;j & lt;256;j + +){//重新将基本256个编码写入   char ch=(char) j;   字符串圣=ch +“”;   嗯。把(圣,j);   }   公司产品名称=" ";   bianma=0;   }   char ch=str.charAt(我);   字符串s=ch + ";   后缀=s;   中建=公司产品名称+后缀;   如果(hm.get(中建)==null){//如果码表中没有前缀加后缀的码表//System.out.print(中建);//system . out。println(“对应的编码为“+ bianma);   嗯。put(中建,bianma);//向码表添加前缀加后缀和对应的编码//system . out。println(" +公司产品名称);//system . out。println(“写入的编码" + hm.get(公司产品名称));   dos.writeChar (hm.get(公司产品名称));//把前缀写入压缩文件   bianma + +;   公司产品名称=后缀;   其他}{//如果有下一个前缀保存上一个前缀加后缀   公司产品名称=中建;   }   如果(我==str.length() - 1){//把最后一个写进去//System.out.print(“写入最后一个“+公司产品名称);   dos.writeChar (hm.get(公司产品名称));//system . out。println (" + hm.get(公司产品名称));   }   }   os.close();//关闭流//System.out.println (hm.toString());//输出码表   }   }            公开课杰亚{   私人ArrayList列表=new ArrayList();//存高八位   私人int数=0;//下标   私人ArrayList

Java压缩之LZW算法字典压缩与解压讲解