博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解压文件与压缩文件(IO流操作)(第三部分结尾)
阅读量:2339 次
发布时间:2019-05-10

本文共 2985 字,大约阅读时间需要 9 分钟。

解压文件与压缩文件(IO流)

压缩文件

/** * * @param srcFile 传入的需要压缩的文件的全路径 * @param dstFile  压缩文件的保存目录 */public static void zipFile(String srcFile,String dstFile){
//创建文件输入流,用于读取文件 FileInputStream is = null; OutputStream os = null; ObjectOutputStream oos = null; try {
is = new FileInputStream(srcFile); 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) {
System.out.println(e.getMessage()); }finally {
try {
is.close(); oos.close(); os.close(); } catch (IOException e) {
e.printStackTrace(); } }}

解压文件

//编写一个方法,完成对压缩文件的解压    public static void unZipFile(String zipFile,String desFile){
//定义文件输入流 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
huffmanCodes = (Map
)ois.readObject(); //解码 byte[] bytes = decode(huffmanCodes,huffmanBytes); //将bytes数组写入到目标文件 os = new FileOutputStream(desFile); //写数据到desFile文件中去 os.write(bytes); }catch (Exception e){
System.out.println(e.getMessage()); }finally {
try {
is.close(); os.close(); ois.close(); } catch (IOException e) {
e.printStackTrace(); } } }

相关知识补充

  1. IO流的原理和分类
  • 按照操作数据单位:
    • 字节流(byte = 8 bit),图片,视频等二进制编码文件,非文本类的数据
    • 字符流(char = 16 bit),常用于文本文件
  • 按照流的角色分为:
    • 结点流:基本四大类

    • 处理流:包覆在节点流上面的,用于处理加工,改变节点流的流

抽象基类 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer
  1. 输入输出的标准化过程
  • 创建File类,File类的实例化
    • File file = new File(“对应的路径”);
  • 对应结点流的实例化
    • fr = new FileReader(file(file类的路径));
    • fw = new FileWriter(file);
    • fis = new FileInputStream(file);
    • fop = new FileOutputStream(file);
  • 执行对应的读入和写入操作
    • 读入操作:read(语句)
    • 写入操作:write(语句)
  1. 缓冲流
    • 作用:提高结点流的读入和读出操作
    • 作用原理:在程序和内存之间开创了一个缓冲区,默认是8KB。
    • 操作流程:在原来的结点流基础上包覆一层缓冲流即可。
      • BufferInputStream bis = new BufferInputStream(fis);(fis 是fileinputstream)
  2. 对象流ObjectInputStream和ObjectOutputStream
    • 作用:使得数据以原来的对象形式进行保存,在内存中长期存在。

使用霍夫曼编码的注意事项

霍夫曼编码压缩文件的注意事项

  1. 如果文件本身就是经过压缩处理的,那么在使用霍夫曼编码再进行压缩,效率就不会有明显的变化,比如视频,ppt等文件。(此类文件在打开的过程中,本就有一个解压的过程,再关闭的过程中本就会对文件进行压缩)
  2. 因为霍夫曼编码是按照字节来处理的,因此可以处理所有二进制的文件(二进制文件,文本文件等)
  3. 如果一个文件中的内容,重复的数据不多,压缩效果也不会明显。

转载地址:http://qqgpb.baihongyu.com/

你可能感兴趣的文章
并发编程实战学习笔记(十一)-原子变量与非阻塞同步机制
查看>>
分布式系统的事务处理
查看>>
硅胶制品为何丝印后字符会掉?
查看>>
模压硅胶产品成型后加工工艺
查看>>
印花硅胶模压成型跟丝印成型产品有什么区别
查看>>
简述:为什么硅胶按键要使用镭雕工艺?
查看>>
在硅胶产品表面处理中,丝印、移印与镭雕的区别
查看>>
java 内存模型:重排序
查看>>
spring IOC容器:控制反转
查看>>
处理器重排序与内存屏障
查看>>
Java内存模型 之三个特性:
查看>>
Java内存 happens-before原则
查看>>
Java虚拟机:类的初始化
查看>>
Oracle表连接方法 (上)
查看>>
谈mvc
查看>>
给年轻工程师的十大忠告!
查看>>
少走弯路的十条忠告
查看>>
未婚男子必读的31条感悟
查看>>
Proteus 使用虚拟串口
查看>>
使用软件虚拟串口
查看>>