数据结构与算法【Java】08---树结构的实际应用( 九 )


思路:读取文件-> 得到赫夫曼编码表 -> 完成压缩
首先我们创建一个图片文件

数据结构与算法【Java】08---树结构的实际应用

文章插图
压缩代码
//编写方法,将一个文件进行压缩/** * * @param srcFile 你传入的希望压缩的文件的全路径 * @param dstFile 我们压缩后将压缩文件放到哪个目录 */public static void zipFile(String srcFile, String dstFile) {//创建输出流OutputStream os = null;ObjectOutputStream oos = null;//创建文件的输入流FileInputStream is = null;try {//创建文件的输入流is = new FileInputStream(srcFile);//创建一个和源文件大小一样的byte[]byte[] b = new byte[is.available()];//读取文件is.read(b);//直接对源文件压缩byte[] huffmanBytes = huffmanZip(b);//创建文件的输出流, 存放压缩文件os = new FileOutputStream(dstFile);//创建一个和文件输出流关联的ObjectOutputStreamoos = new ObjectOutputStream(os);//把 赫夫曼编码后的字节数组写入压缩文件oos.writeObject(huffmanBytes);//这里我们以对象流的方式写入 赫夫曼编码,是为了以后我们恢复源文件时使用//注意一定要把赫夫曼编码 写入压缩文件oos.writeObject(huffmanCodes);}catch (Exception e) {System.out.println(e.getMessage());}finally {try {is.close();oos.close();os.close();}catch (Exception e) {System.out.println(e.getMessage());}}}
测试代码
//测试压缩文件String srcFile = "E:\\数据结构与算法学习\\myself\\owncode\\resources\\3.jpg";String dstFile ="E:\\数据结构与算法学习\\myself\\owncode\\resources\\3.zip";zipFile(srcFile,dstFile);System.out.println("压缩文件成功");
结果

数据结构与算法【Java】08---树结构的实际应用

文章插图
3.7、文件解压具体要求:将前面压缩的文件,重新恢复成原来的文件 。
思路:读取压缩文件(数据和赫夫曼编码表)-> 完成解压(文件恢复)
文件解压代码
//编写一个方法,完成对压缩文件的解压/** * * @param zipFile 准备解压的文件 * @param dstFile 将文件解压到哪个路径 */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数组huffmanBytesbyte[] huffmanBytes = (byte[])ois.readObject();//读取赫夫曼编码表Map<Byte,String> huffmanCodes = (Map<Byte,String>)ois.readObject();//解码byte[] bytes = decode(huffmanCodes, huffmanBytes);//将bytes 数组写入到目标文件os = new FileOutputStream(dstFile);//写数据到 dstFile 文件os.write(bytes);} catch (Exception e) {System.out.println(e.getMessage());} finally {try {os.close();ois.close();is.close();} catch (Exception e2) {System.out.println(e2.getMessage());}}}
测试代码
//测试解压文件String zipFile = "E:\\数据结构与算法学习\\myself\\owncode\\resources\\3.zip";String dstFile = "E:\\数据结构与算法学习\\myself\\owncode\\resources\\32.jpg";unZipFile(zipFile,dstFile);System.out.println("解压成功");
结果

数据结构与算法【Java】08---树结构的实际应用

文章插图
我们取文件夹中查看发现原始的图片和解压后的文件大小一样---->无损压缩
数据结构与算法【Java】08---树结构的实际应用

文章插图

数据结构与算法【Java】08---树结构的实际应用

经验总结扩展阅读