<强>压缩过程:强>
前面已经写过一篇哈夫曼压缩,LZW字典压缩与哈夫曼压缩的不同之处在于不需要把编码写入文件,编码表是在读文件中生成的,首先将0 - 255个ASCLL码与对应的数字存入哈希表中,作为基础码表。
这里的后缀为当前
前缀+后缀如果在码表中存在,前缀等于前缀+后缀。如果不存在,将前缀+后缀所表示的字符串写入编码表编码,同时将前缀写入压缩文件中。这里重点注意一下,一个字节所能表示的数字范围为0 - 255,所以我们将一个字符的编码变成两个字节写进去,分别写入它的高八位和低八位,比如256即为00000001 11111111这里用到DataOutputStream dos对象中的dos.writeChar(256)方法。
两个字节所能表示的范围为0 - 65535。当我们的编码超过这份范围,就需要重置编码表,再重新编码。
<>强解压过程强>
连续波表示读取的到的字符,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算法字典压缩与解压讲解