【数据结构39】哈夫曼编码实现文件压缩与解压

【数据结构39】哈夫曼编码实现文件压缩与解压_第1张图片

/**
* 将文件进行压缩
* @param strFile 传入的希望压缩的文件的全路径
* @param dstFile 将压缩文件放到哪个目录
*/
public static void zipFile(String srcFile,String dstFile){
   //创建输出流
   FileInputStream is = null;
   FileOutputStream os = null;
   ObjectOutputStream oos = null;
   try {
       //创建文件的输入流
       is = new FileInputStream(srcFile);
       //创建一个和源文件大小一样的byte数组
       byte[] b = new byte[is.available()];
       //读取文件
       is.read(b);
       //直接对源文件进行压缩
       byte[] huffmanBytes = huffmanZip(b);
       //创建文件的输出流,存放压缩文件
       os = new FileOutputStream(dstFile);
       //创建一个和文件输出流相关联的ObjectOutputStream
       oos = new ObjectOutputStream(os);
       //以对象流的方式写入哈夫曼编码,为了以后恢复源文件的时候使用
       oos.writeObject(huffmanBytes);
       //把赫夫曼编码后的字节数组写入压缩文件
       oos.writeObject(huffmanCodes);

   } catch (Exception e) {
       e.printStackTrace();
   } finally {
       try {
           is.close();
           os.close();
           oos.close();
       } catch (Exception e) {
           System.out.println(e.getMessage());
       }
   }
}

【数据结构39】哈夫曼编码实现文件压缩与解压_第2张图片

//编写一个方法完成对压缩文件的解压
public static void unZipFile(String zipFile,String dstFile){
   //定义文件输入流
   InputStream is = null;
   //定义一个对象输入流
   ObjectInputStream ois = null;
   //定义文件的输出流
   OutputStream os = null;
   try {
       //创建文件输入流
       is = new FileInputStream(zipFile);
       //创建一个与is关联的对象输入流
       ois = new ObjectInputStream(is);
       //读取byte数组huffmanBytes
       byte[] huffmanBytes = (byte[]) ois.readObject();
       //读取赫夫曼表
       Map<Byte, String> huffmanCodes = (Map<Byte, String>) ois.readObject();
       //解码
       byte[] bytes = decode(huffmanCodes, huffmanBytes);
       //把bytes写入到目标文件
       os = new FileOutputStream(dstFile);
       os.write(bytes);

   }catch (Exception e) {
       System.out.println(e.getMessage());
   } finally {
       try {
           os.close();
           ois.close();
           is.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
}

测试代码:

public class HuffmanCode {
    public static void main(String[] args) {
//        //测试压缩文件
//        String srcFile = "C:\\Users\\hh\\Desktop\\2.png";
//        String dstFile = "C:\\Users\\hh\\Desktop\\dst.zip";
//        zipFile(srcFile,dstFile);
        //测试解压文件
        String zioFile = "C:\\Users\\hh\\Desktop\\dst.zip";
        String dstFile = "C:\\Users\\hh\\Desktop\\1.jpg";
        unZipFile(zioFile,dstFile);

    }

你可能感兴趣的:(数据结构与算法)