手机端小强原创文章,java小强个人博客站点
当前位置: 首页 >> 理论 >> Java 中 解压缩文件

Java 中 解压缩文件

24030 理论 | 2014-12-10

都是JDK中原带的工具类和方法,压缩是Deflater类,解压是Inflater类!

该文章仅仅展示这两个类的实际使用,不用拍砖!

 

我们找一个压缩后能明显看出压缩效果的文件,比如DOC类文件,然后使用360压缩将其压缩,看压缩后大小

然后使用我们的程序进行压缩处理,看处理后的文件大小

最后进行解压,然后运行文件看压缩是否对文件产生了损坏

 

压缩:

package com.xidian;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.zip.Deflater;
/**
 * 压缩类
 * 
 * @说明 缓冲区越大,速度越快
 * @author cuisuqiang
 * @version 1.0
 * @since
 */
public class ZipDirectory {
 public static void main(String[] args) throws Exception {
  en();
 }
 public static void en() throws Exception {
  // 输入流
  InputStream is = new FileInputStream("C:\\详细设计.doc");
  // 字节输出流
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  // 缓冲区 缓冲区越大,速度越快
  byte[] bu = new byte[1024 * 100];
  int count = 0;
  // 将流写到字节输出流中
  while ((count = is.read(bu)) > 0) {
   baos.write(bu, 0, count);
  }
  // 将字节输出流转为字节数组
  byte[] text = baos.toByteArray();
  // 如果要使用同一个流对象,一定要重设清空原有数据
  baos.reset();
  // 压缩器
  Deflater compresser = new Deflater();
  // 重置 deflater 以处理新的输入数据集
  compresser.reset();
  // 为压缩设置输入数据
  compresser.setInput(text);
  // 调用时,指示压缩应当以输入缓冲区的当前内容结尾
  compresser.finish();
  try {
   byte[] buf = new byte[1024 * 100];
   // 如果已到达压缩数据输出流的结尾,则返回 true
   while (!compresser.finished()) {
    int i = compresser.deflate(buf);
    baos.write(buf, 0, i);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  // 关闭解压缩器并放弃所有未处理的输入
  compresser.end();
  // 输出流 这里大家应该知道,输出任意名称,带不带后缀都是可以的,因为在Java中只有文件和文件夹之分
  FileOutputStream fos = new FileOutputStream("C:\\详细设计");
  // 将字节输出流写入到输出流中
  baos.writeTo(fos);
  fos.close();
  baos.close();
  is.close();
  System.out.println("压缩完毕");
 }
}

解压:

package com.xidian;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.zip.Inflater;
/**
 * 解压缩类
 * 
 * @说明  缓冲区越大,速度越快
 * @author cuisuqiang
 * @version 1.0
 * @since
 */
public class Decompresser {
 public static void main(String[] args) throws Exception {
  de();
 }
 public static void de() throws Exception {
  // 输入流
  InputStream is = new FileInputStream("C:\\详细设计");
  // 字节输出流
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  // 缓冲区 缓冲区越大,速度越快
  byte[] bu = new byte[1024 * 100];
  int count = 0;
  // 将流写到字节输出流中
  while ((count = is.read(bu)) > 0) {
   baos.write(bu, 0, count);
  }
  // 将字节输出流转为字节数组
  byte[] text = baos.toByteArray();
  // 如果要使用同一个流对象,一定要重设清空原有数据
  baos.reset();
  // 解压器
  Inflater decompresser = new Inflater();
  // 重置 inflater 以处理新的输入数据集
  decompresser.reset();
  // 为解压缩设置输入数据
  decompresser.setInput(text);
  // 用于接受压缩后的数据
  try {
   // 缓冲
   byte[] buf = new byte[1024 * 100];
   // 如果已到达压缩数据流的结尾,则返回 true
   while (!decompresser.finished()) {
    int i = decompresser.inflate(buf);
    baos.write(buf, 0, i);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  // 关闭解压缩器并放弃所有未处理的输入
  decompresser.end();
  // 输出流
  FileOutputStream fos = new FileOutputStream("C:\\详细设计.doc");
  // 将字节输出流写入到输出流中
  baos.writeTo(fos);
  fos.close();
  baos.close();
  is.close();
  System.out.println("解压完毕");
 }
}

仅供参考。

推荐您阅读更多有关于“ java jdk 压缩 解压 损坏 ”的文章

上一篇:QQ截图生成图片文件过大 下一篇:Java中字节数组与十六进制间的转换

猜你喜欢

发表评论:

个人资料
blogger

java小强
没有思考,人生的路会越走越难!

搜索
分类
最新微语
  • 车也学了,年也过了,生日也过了,村里的会也赶了,这次,是真的,年过去了。不过我没回京,也没有在家找工作,我在等什么吗?反正现在正合了我这个懒人的要求,不过,我歇不住,思考下人生。

    2018-03-20 00:11

  • 8月1日,我已离开奋斗多年的北京。不知道是暂时的离开,还是永久的离别,反正已经离职在家,告别每日上班,每天苦累的煎熬,过一段属于自己的生活。以前是专职工作,现在专职生活。

    2017-08-18 12:47

  • 又弄完一个项目,累成狗,但是感觉又进步不少,除了很多坑已经踩过,做起来也是轻车熟路。同时也认识到,程序不在于你多牛逼,而是在乎你的细节把控度,而细节的关注,是一个优秀程序员必须要注意的。另外,要相信自己,勇敢向前,没人生下来就是成功的,而且,成功的路,比成功本身更重要。

    2017-06-30 09:46

  • 今日北京再次沙尘暴来袭,吃了几年细粮,终于能来口粗粮了,不过大早上看见这场景,还是吓我一跳,不过随后就平静了,毕竟是老朋友了。进公司又发现一股烤糊的味道,真是祸不单行啊,例外都是污染。发了两个口罩,开启保护模式。

    2017-05-04 10:16

  • 今天同学问我,最近还在写代码吗?我想了想,这个问题怎么回答呢,我好像确实很长时间,虽然写了一些,但是主要内容已经不是写代码了。然后再想想,自己也7年多了,这么多年了,我收获了什么,我的目标到底是什么。眼看就奔三了,人生啊,开启感叹模式。

    2017-03-30 22:52

  • 更多»

最新文章
热门文章
随机文章