Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 547|回复: 0

[算法学习]使用huffman编码压缩文件并读取

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-23 00:06:03 | 显示全部楼层 |阅读模式
    已经实现了huffman的编码过程,但是不知道如何用编码方式对文件进行压缩.下面给出简单的代码。 对范例文件test.dat的压缩比例为:126byte/27byte
    1.     import java.io.BufferedInputStream;  
    2.     import java.io.BufferedOutputStream;  
    3.     import java.io.File;  
    4.     import java.io.FileInputStream;  
    5.     import java.io.FileOutputStream;  
    6.     import java.io.IOException;  
    7.     import java.util.Scanner;  
    8.       
    9.     public class WriteBinary  
    10.    {  
    11.        //由huffman算法产生的编码表  
    12.        String[] code = {"0", "10", "11"};  
    13.          
    14.        /**
    15.         * 测试函数
    16.         *@param args
    17.         */  
    18.        public static void main(String args[])  
    19.        {  
    20.            WriteBinary w = new WriteBinary();  
    21.            try  
    22.           {  
    23.                w.write("test.dat", "test.hfm"); //将test.dat文件的内容进行编码写入test.hfm  
    24.                System.out.println(w.read("test.hfm")); // 从压缩后的文件中还原出源文件的内容,并打印  
    25.            } catch (IOException e)  
    26.            {  
    27.                e.printStackTrace();  
    28.            }  
    29.        }  
    30.          
    31.        /**
    32.         * 对源文件进行编码,并写入目标文件
    33.         *@param from 需要进行编码的源文件
    34.         *@param to 目标文件
    35.         *@throws IOException
    36.         */  
    37.        public void write(String from, String to) throws IOException  
    38.        {  
    39.            File fromFile = new File(from);  
    40.            Scanner scan = new Scanner(fromFile);  
    41.            File f = new File(to);  
    42.           BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(f));  
    43.            while(scan.hasNextLine())  
    44.            {  
    45.                String line = scan.nextLine();  
    46.                System.out.println(line);  
    47.                  
    48.                //将文件中的所有字符用编码替换  
    49.                //如果字符种类很多,应该将编码对应表存入数组转换,而不应该像下面一样硬编码  
    50.                line = line.replace("a", code[0]);  
    51.               line = line.replace("b", code[1]);  
    52.                line = line.replace("c", code[2]);  
    53.               System.out.println(line);  
    54.                byte[] buf = new byte[line.length() / 7];  
    55.                  
    56.                //将编号码的String进行转化,转化成 byte数组,并存入文件,除去符号位,每7位对应1byte  
    57.                for(int i = 0; i * 7 + 7 <= line.length(); i ++)  
    58.                    buf[i] = Byte.valueOf(line.substring(i * 7, i * 7 + 7), 2);  
    59.                out.write(buf);  
    60.            }  
    61.            out.flush();  
    62.            out.close();  
    63.            scan.close();  
    64.        }  
    65.          
    66.        /**
    67.         * 从编码后的文件中读取并解码,返回原文件的内容
    68.         *@param file 编码后的文件
    69.         *@return 源文件内容的字符串
    70.         *@throws IOException
    71.         */  
    72.        public String read(String file) throws IOException  
    73.        {  
    74.            BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));  
    75.            StringBuffer resultStr = new StringBuffer();    //最终需要返回的结果  
    76.            StringBuffer codeStr = new StringBuffer();  //需要解析的编码的字符串  
    77.            byte[] buf = new byte[1];  
    78.             
    79.            //从文件中读出byte数组,并转化成二进制字符串  
    80.            while(in.read(buf) != -1)  
    81.           {  
    82.                   //把从文件中读取出的byte转化成二进制字符串  
    83.                    String bStr = Integer.toBinaryString(buf[0]);  
    84.                   StringBuffer temp = new StringBuffer();  
    85.                    //对二进制字符串补0,因为 Integer.toBinaryString方法转化成的二进制数会省略前面的若干个0  
    86.                   for(int j = 0; j < 7 - bStr.length(); j ++)  
    87.                        temp.append("0");  
    88.                    //将读取出并转化好的二进制字符串放入codeStr,留待下一步对其进行解码  
    89.                    codeStr.append(temp + bStr);  
    90.            }  
    91.             
    92.            in.close();  
    93.      
    94.            //对上面转化成的二进制字符串进行解码  
    95.                for(int i = 0; i < codeStr.length(); i ++)  
    96.                {  
    97.                    //huffman解码过程  
    98.                    if(codeStr.charAt(i) == "0")  
    99.                        resultStr.append("a");  
    100.                   else  
    101.                   {  
    102.                       i++;  
    103.                       if(i >= codeStr.length())  
    104.                          break;  
    105.                       if(codeStr.charAt(i) == "0")  
    106.                           resultStr.append("b");  
    107.                       else  
    108.                           resultStr.append("c");  
    109.                   }  
    110.               }  
    111.           return new String(resultStr);  
    112.       }  
    113. }  
    复制代码
    test.dat的内容 aaabbcaaabbcbaaaabbcaaabbcbaaaabbcaaabbcbaaaabbcaaabbcbaaaabbcaaabbcbaaaabbcaaabbcbaa
    aabbcaaabbcbaaaabbcaaabbcbaaaabbcaaabbcba ps: 给出的代码只能对转换成二进制后,二进制位为7的倍数的文件进行压缩,如果需要弥补这个问题,需要在编码后的文件头中写入源文件的大小,本程序为简便起见,未作处理
       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/23/000603625.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 04:39 , Processed in 0.297424 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表