返回顶部
首页 > 资讯 > 后端开发 > Python >java实现哈夫曼文件解压缩
  • 673
分享到

java实现哈夫曼文件解压缩

2024-04-02 19:04:59 673人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了java实现哈夫曼文件解压缩的具体代码,供大家参考,具体内容如下 1、哈夫曼压缩对已经经过压缩处理的文件压缩率比较低,比如ppt和视频。 2、这个程序主要涉及到集

本文实例为大家分享了java实现哈夫曼文件解压缩的具体代码,供大家参考,具体内容如下

1、哈夫曼压缩对已经经过压缩处理的文件压缩率比较低,比如ppt和视频。

2、这个程序主要涉及到集合、树、io相关知识。

字符的统计可以用map集合进行统计。
哈夫曼树的构建过程也并不复杂:
①先对树的集合按照根节点大小进行排序
②拿出根节点数值最小的两棵树,用它两构建成一颗新的树;
③从集合中删除之前那两颗根节点最小的数;
④把新生成的树加入到集合中
一直循环重复上面的过程,直到集合的大小变成1为止;
写出、读取文件时注意使用对象流Object流。

3、个程序可以对字符进行压缩,也可以对文件进行压缩。代码中的主函数中只是调用了对文件解压缩的方法,若想对字符进行解压缩,可以调用对应的方法。

4、代码如下:


package huffmancode;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class HuffManCode 
{

 public static void main(String[] args) 
 {
  String srcFile="d://mydata.txt";//要压缩的文件
  String dstFile="d://mydata.zip";//压缩后的文件
  zipFile(srcFile, dstFile);//压缩文件
  System.out.println("压缩成功!");
  
  unZipFile(dstFile,"d://unzip.txt");//对刚才的文件进行解压,解压后的文件名称叫做unzip.txt
  System.out.println("解压文件成功!");  
 }
 
 public static void unZipFile(String zipFile,String dstFile)
 {
  InputStream inputStream=null;
  ObjectInputStream objectInputStream=null;
  OutputStream outputStream=null;
  try 
  {
   inputStream=new FileInputStream(zipFile);
   objectInputStream=new ObjectInputStream(inputStream);
   byte [] array= (byte [])objectInputStream.readObject();
   Map<Byte,String> map=(Map<Byte,String>)objectInputStream.readObject();
   byte[] decode = decode(map, array);
   outputStream=new FileOutputStream(dstFile);
   outputStream.write(decode);
  } catch (Exception e) 
  {
   System.out.println(e);
  }finally
  {
   try {
    outputStream.close();
    objectInputStream.close();
    inputStream.close();
    
   } catch (Exception e2) {
    System.out.println(e2);
   }
   
  }
  
  
 }
 
 public static void zipFile(String srcFile,String dstFile)
 {
  FileInputStream inputStream=null;
  OutputStream outputStream=null;
  ObjectOutputStream objectOutputStream=null;
  
  try 
  {
   inputStream=new FileInputStream(srcFile);
   byte [] b=new byte[inputStream.available()];
   inputStream.read(b);
   byte[] huffmanZip = huffmanZip(b);
   outputStream=new FileOutputStream(dstFile);
   objectOutputStream=new ObjectOutputStream(outputStream);
   objectOutputStream.writeObject(huffmanZip);
   objectOutputStream.writeObject(map);
  } catch (Exception e)
  {
   System.out.println(e);
  }
  finally 
  {
   if(inputStream!=null)
   {
    try 
    {
     objectOutputStream.close();
     outputStream.close();
     inputStream.close();//释放资源
    
    } catch (Exception e2) 
    {
     System.out.println(e2);
    }
    
   }  
  }
 }
 
 private static byte[] decode(Map<Byte, String> map,byte [] array)
 {
  StringBuilder stringBuilder = new StringBuilder();
  for(int i=0;i<array.length;i++)
  {
   boolean flag=(i==array.length-1);
   stringBuilder.append(byteToBitString(!flag, array[i]));
  }
  
  Map<String, Byte> map2=new HashMap<String, Byte>();//反向编码表
  Set<Byte> keySet = map.keySet();
  for(Byte b:keySet)
  {
   String value=map.get(b);
   map2.put(value, b);
  }
  List<Byte> list=new ArrayList<Byte>();
  for (int i = 0; i < stringBuilder.length();) 
  {
   int count=1;
   boolean flag=true;
   Byte byte1=null;
   while (flag) 
   {
    String substring = stringBuilder.substring(i, i+count);
    byte1 = map2.get(substring);
    if(byte1==null)
    {
     count++;
    }
    else 
    {
     flag=false;
    }
    
   }
   list.add(byte1);
   i+=count;  
  }
  
  byte [] by=new byte[list.size()];
  for(int i=0;i<by.length;i++)
  {
   by[i]=list.get(i);
  }
  return by;
 }
 
 private static String byteToBitString(boolean flag, byte b)
 {
  int temp=b;
  if(flag)
  {
   temp|=256;
  }
  
  String binaryString = Integer.toBinaryString(temp);
  if(flag)
  {
   return binaryString.substring(binaryString.length()-8);
  }
  else
  {
   return binaryString;
  }
  
 }
 
 private static byte[] huffmanZip(byte [] array)
 {
  List<node> nodes = getNodes(array);
  Node createHuffManTree = createHuffManTree(nodes);
  Map<Byte, String> m=getCodes(createHuffManTree);
  byte[] zip = zip(array, m);
  return zip; 
 }
 
 //
 private static byte[] zip(byte [] array,Map<Byte,String> map)
 {
  StringBuilder sBuilder=new StringBuilder();
  for(byte item:array)
  {
   String value=map.get(item);
   sBuilder.append(value);
  }
  //System.out.println(sBuilder);
  int len;
  if(sBuilder.toString().length()%8==0)//如果可以整除
  {
   len=sBuilder.toString().length()/8;
  }
  else //如果不能整除
  {
   len=sBuilder.toString().length()/8+1;
  }
  
  byte [] by=new byte[len];
  int index=0;
  for(int i=0;i<sBuilder.length();i+=8)
  {
   String string;
   if((i+8)>sBuilder.length())
   {
    string=sBuilder.substring(i);
   }
   else 
   {
    string=sBuilder.substring(i, i+8);
   }
      
   by[index]=(byte)Integer.parseInt(string,2);
   index++;
  }
  
  return by;
   
 }
 
 
 //重载
 private static Map<Byte, String> getCodes(Node root)
 {
  if(root==null)
  {
   return null;
  }
  getCodes(root.leftNode,"0",sBuilder);
  getCodes(root.rightNode,"1",sBuilder);
  return map;
 }
 
 
 
 //获取哈夫曼编码
  static Map<Byte, String> map=new HashMap<>();
  static StringBuilder sBuilder=new StringBuilder();
  public static void getCodes(Node node,String code,StringBuilder stringBuilder)
  {
   StringBuilder stringBuilder2=new StringBuilder(stringBuilder);
   stringBuilder2.append(code);
   if(node!=null)
   {
    if(node.data==null)//非叶子结点
    {
     //向左递归
     getCodes(node.leftNode,"0",stringBuilder2);
     //向右递归
     getCodes(node.rightNode,"1",stringBuilder2);
    }
    else //如果是叶子结点
    {
     map.put(node.data,stringBuilder2.toString());
    }
   }
  }
 
 
 
 public static List<Node> getNodes(byte [] array)
 {
  List<Node> list=new ArrayList<Node>();
  Map<Byte, Integer> map=new HashMap<Byte, Integer>();
  for(Byte data:array)
  {
   Integer count=map.get(data);//通过键获取值
   if(count==null)//说明此时map集合中还没有改字符
   {
    map.put(data, 1);
   }
   else 
   {
    map.put(data,count+1);
   }
  }
  //遍历map集合
  Set<Byte> set=map.keySet();
  for(Byte key:set)
  {
   int value=map.get(key);
   Node node=new Node(key, value);
   list.add(node);
  }
  return list;
 }
 
 private static Node createHuffManTree(List<Node> list)
 {
  while(list.size()>1)
  {
   Collections.sort(list);//先对集合进行排序
   Node leftNode=list.get(0);
   Node rightNode=list.get(1);
   
   Node parentNode=new Node(null, leftNode.weight+rightNode.weight);
   parentNode.leftNode=leftNode;
   parentNode.rightNode=rightNode;
   
   list.remove(leftNode);
   list.remove(rightNode);
   
   list.add(parentNode);
  }
  return list.get(0);
  
 }

}

class Node implements Comparable<Node>
{
 Byte data;//字符
 int weight;//字符出现的次数
 Node leftNode;
 Node rightNode;
 
 public Node(Byte data,int weight)//构造器
 {
  this.data=data;
  this.weight=weight;
 }

 @Override
 public int compareTo(Node o) 
 {
  return this.weight-o.weight;
 }

 @Override
 public String toString() 
 {
  return "Node [data=" + data + ", weight=" + weight + "]";
 }
 
 //前序遍历
 public void preOrder()
 {
  System.out.println(this);
  if(this.leftNode!=null)
  {
   this.leftNode.preOrder();
  }
  if(this.rightNode!=null)
  {
   this.rightNode.preOrder();
  }
 }
 
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: java实现哈夫曼文件解压缩

本文链接: https://lsjlt.com/news/128342.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java实现哈夫曼文件解压缩
    本文实例为大家分享了java实现哈夫曼文件解压缩的具体代码,供大家参考,具体内容如下 1、哈夫曼压缩对已经经过压缩处理的文件压缩率比较低,比如ppt和视频。 2、这个程序主要涉及到集...
    99+
    2024-04-02
  • Java之哈夫曼压缩原理案例讲解
    1. 哈夫曼压缩原理 首先要明确一点,计算机里面所有的文件都是以二进制的方式存储的。 在计算机的存储单元中,一个ASCII码值占一个字节,1个字节等于8位(1Byt...
    99+
    2024-04-02
  • Java利用哈夫曼编码实现字符串压缩
    赫夫曼编码基本介绍 1) 赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法 2) 赫夫曼编码是赫哈夫曼树在电讯通信中...
    99+
    2024-04-02
  • Java中的哈夫曼压缩原理是什么
    这篇文章主要介绍“Java中的哈夫曼压缩原理是什么”,在日常操作中,相信很多人在Java中的哈夫曼压缩原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的哈夫曼压缩原理是什么”的疑惑有所帮助!...
    99+
    2023-06-20
  • 基于C语言利用哈夫曼树实现文件压缩的问题
    一、哈夫曼树         具有n个权值的n个叶子结点,构造出一个二叉树,使得该树的带权路径长度(W...
    99+
    2024-04-02
  • Java实现赫夫曼树(哈夫曼树)的创建
    目录一、赫夫曼树是什么?1.路径和路径长度2.节点的权和带权路径长度3.树的带权路径长度二、创建赫夫曼树1.图文创建过程2.代码实现一、赫夫曼树是什么? 给定N个权值作为N个叶子结点...
    99+
    2024-04-02
  • 怎么利用java语言实现一个哈夫曼压缩功能
    本篇文章给大家分享的是有关怎么利用java语言实现一个哈夫曼压缩功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。哈夫曼压缩的原理: 通过统计文件中每个字节出现的频率,将8位的...
    99+
    2023-05-31
    java 哈夫曼压缩 ava
  • 哈夫曼树实现 python
    参考博客: http://linux.xidian.edu.cn/bbs/thread-70-1-1.html 基本上相当于抄写一遍了。。呃呃。。。...
    99+
    2023-01-31
    哈夫曼树 python
  • c#实现哈夫曼树算法
    今天看了一下数据结构,一个练习就是构建哈夫曼树,就顺手用C#写了一个。 static void Main(string[] args) { var numbers = new...
    99+
    2024-04-02
  • C++怎么实现哈夫曼树
    这篇文章主要讲解了“C++怎么实现哈夫曼树”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么实现哈夫曼树”吧!哈夫曼树的基本概念Q:什么是哈夫曼树A:哈夫曼树又称最优树,是一类带权路径...
    99+
    2023-06-30
  • Python语言实现哈夫曼编码
    汉语版:使用python实现huffman编码是一个能够很快地实现。所以我们选择使用python来实现我们这个程序。 l E-version: we will use python to realize this program call...
    99+
    2023-01-31
    语言 Python 哈夫曼
  • Java数据结构之哈夫曼树概述及实现
    目录一、与哈夫曼树相关的概念二、什么是哈夫曼树三、哈夫曼树的构造方法四、哈夫曼树的代码实现一、与哈夫曼树相关的概念 概念 ...
    99+
    2024-04-02
  • C语言实现哈夫曼树的方法
    本文实例为大家分享了C语言实现哈夫曼树的具体代码,供大家参考,具体内容如下 准备工作: 1、定义一个结构体,表示一个节点。其中,这个结构体有4个成员变量,分别表示是这个节点的权值,父...
    99+
    2024-04-02
  • C++使用数组来实现哈夫曼树
    目录写在前面构造思想算法设计构造实例理解代码确定结构体循环找出最小值调用细节调试试图总结写在前面 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树...
    99+
    2024-04-02
  • C++详解哈夫曼树的概念与实现步骤
    目录一、基本概念二、构造哈夫曼树三、哈夫曼树的基本性质四、哈夫曼编码五、哈夫曼解码六、文件的压缩和解压缩一、基本概念 结点的权: 有某种现实含义的数值 结点的带权路径长度: 从结点的...
    99+
    2024-04-02
  • Java实现文件压缩为zip和解压zip压缩包
    目录压缩成.zip解压.zip压缩成.zip 代码如下: public static void toZip(String srcDir, OutputStream out) th...
    99+
    2024-04-02
  • Java数据结构之实现哈夫曼树的示例分析
    这篇文章主要介绍了Java数据结构之实现哈夫曼树的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、与哈夫曼树相关的概念概念含义1. 路径从树中一个结点到另一个结点的...
    99+
    2023-06-15
  • java工具类 - 实现文件压缩zip及解压缩
    对hutool工具类进行的封装 依赖 cn.hutool hutool-all 5.8.15 ...
    99+
    2023-10-28
    java
  • Java压缩与解压缩ZIP文件
    文章目录 前言Java解压缩文件压缩和解压缩ZIP文件检验应用总结 前言 在现代计算机上,数据传输和存储越来越依赖于文件压缩技术。当我们需要发送大量数据时,压缩文件可以大大减少传输时间...
    99+
    2023-09-11
    java zip 压缩文件 解压缩文件 ZipOutputStream
  • Java如何实现文件压缩为zip和解压zip压缩包
    本篇内容介绍了“Java如何实现文件压缩为zip和解压zip压缩包”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!压缩成.zip代码如下:pu...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作