Java GZIPOutputStream流压缩文件的操作

 更新时间:2021年02月08日 14:32:17   作者:3075763007  
这篇文章主要介绍了Java GZIPOutputStream流压缩文件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我就废话不多说了,大家还是直接看代码吧~

不多说,直接上代码

public static void main(String[] args) throws Exception{
    
    //压缩文件
    File src = new File("e:/xx/aa.txt");
    File zipFile = new File("e:/xx/a.zip");
    FileOutputStream fos = new FileOutputStream(zipFile);
    ZipOutputStream zos = new ZipOutputStream(fos);
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
    ZipEntry entry = new ZipEntry( src.getName());
    zos.putNextEntry(entry);
    int count;
    byte[] buf = new byte[1024];
    while ((count = bis.read(buf)) != -1) {
      zos.write(buf, 0, count);
    }
    bis.close();
    //fos.close();
    zos.close();//
    }

压缩的步骤是:

src将要压缩的文件,zipFile 压缩后的文件,压缩流套接zipFile,然后将src文件写入zipFile,其中ZipEntry中放入的源文件的当前名称,putNextEntry是将源文件的当前名称定位到条目数据的开始处。

补充:Java ZIP压缩输入输出流

ZIP是一种较为常见的压缩形式,在Java中要想实现ZIP的压缩需要导入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputStream、ZipEntry几个类完成。

ZipOutputStream类的常用方法

ZipInputStream类的常用方法

在JAVA IO中,不仅可以实现ZIP压缩格式的输入、输出,也可以实现JAR及GZIP文件格式的压缩:

1、JAR压缩的支持类保存在java.util.jar包中,常用的类有 JarOutputStream(JAR压缩输出流)、JarInputStream(JAR压缩输入流)、JARFile(JAR文件)、JAREntry(JAR实体)

2、GZIP是用于UNIX系统的文件压缩,在Linux中经常会使用到*.gz的文件,就是GZIP格式,GZIP压缩的支持类保存在java.util.zip包中,常用的类有 GZIPOutputStream(GZIP压缩输出流)、GZIPInputStream(GZIP压缩输入流)

注意:

1、压缩文件中的每一个压缩实体都使用ZipEntry保存,一个压缩文件中可能包含一个或多个ZipEntry对象。

2、在JAVA中可以进行zip、jar、gz三种格式的压缩支持,操作流程基本上是一致的。

3、ZipOutputStream可以进行压缩的输出,但是输出的位置不一定是文件。

4、ZipFile表示每一个压缩文件,可以得到每一个压缩实体的输入流。

压缩文件

import java.io.*;
import java.util.zip.*; 
public class MyZip { // 创建类
 private void zip(String zipFileName, File inputFile) throws Exception {
 ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
  zipFileName)); // 创建ZipOutputStream类对象
 zip(out, inputFile, ""); // 调用方法
 System.out.println("压缩中…"); // 输出信息
 out.close(); // 将流关闭
 }
 
 private void zip(ZipOutputStream out, File f, String base)
  throws Exception { // 方法重载
 if (f.isDirectory()) { // 测试此抽象路径名表示的文件是否是一个目录
  File[] fl = f.listFiles(); // 获取路径数组
  out.putNextEntry(new ZipEntry(base + "/")); // 写入此目录的entry
  base = base.length() == 0 ? "" : base + "/"; // 判断参数是否为空
  for (int i = 0; i < fl.length; i++) { // 循环遍历数组中文件
  zip(out, fl[i], base + fl[i]);
  }
 } else {
  out.putNextEntry(new ZipEntry(base)); // 创建新的进入点
  // 创建FileInputStream对象
  FileInputStream in = new FileInputStream(f);
  int b; // 定义int型变量
  System.out.println(base);
  while ((b = in.read()) != -1) { // 如果没有到达流的尾部
  out.write(b); // 将字节写入当前ZIP条目
  }
  in.close(); // 关闭流
 }
 }
 
 public static void main(String[] temp) { // 主方法
 MyZip book = new MyZip(); // 创建本例对象
 try {
  // 调用方法,参数为压缩后文件与要压缩文件
  book.zip("hello.zip", new File("src"));
  System.out.println("压缩完成"); // 输出信息
 } catch (Exception ex) {
  ex.printStackTrace();
 }
 }
}

解压文件

import java.io.*;
import java.util.zip.*;
 
public class Decompressing { // 创建文件
 public static void main(String[] temp) {
 ZipInputStream zin; // 创建ZipInputStream对象
 try { // try语句捕获可能发生的异常
  zin = new ZipInputStream(new FileInputStream("hello.zip"));
  // 实例化对象,指明要进行解压的文件
  ZipEntry entry = zin.getNextEntry(); // 获取下一个ZipEntry
  while (((entry = zin.getNextEntry()) != null)
   && !entry.isDirectory()) {
  // 如果entry不为空,并不在同一目录下
  File file = new File("d:\\" + entry.getName()); // 获取文件目录
  System.out.println(file);
  if (!file.exists()) { // 如果该文件不存在
   file.mkdirs();// 创建文件所在文件夹
   file.createNewFile(); // 创建文件
  }
  zin.closeEntry(); // 关闭当前entry
  System.out.println(entry.getName() + "解压成功");
  }
  zin.close(); // 关闭流
 } catch (Exception e) {
  e.printStackTrace();
 }
 }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Java SMM框架关联关系映射示例讲解

    Java SMM框架关联关系映射示例讲解

    SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层,使用spring MVC负责请求的转发和视图管理,spring实现业务对象管理,mybatis作为数据对象的持久化引擎
    2022-08-08
  • 配置tjxCold(idea效率插件)的模版教程详解

    配置tjxCold(idea效率插件)的模版教程详解

    这篇文章主要介绍了配置tjxCold(idea效率插件)的模版教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • SpringBoot内部调用事务不起作用问题的解决方案

    SpringBoot内部调用事务不起作用问题的解决方案

    这篇文章主要介绍了SpringBoot事务不起作用问题的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java 如何安全的发布对象

    Java 如何安全的发布对象

    这篇文章主要介绍了Java 如何安全的发布对象,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-01-01
  • 浅析Java中Apache BeanUtils和Spring BeanUtils的用法

    浅析Java中Apache BeanUtils和Spring BeanUtils的用法

    这篇文章主要介绍了Java中Apache BeanUtils和Spring BeanUtils的用法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 关于springboot-starter-undertow和tomcat的区别说明

    关于springboot-starter-undertow和tomcat的区别说明

    这篇文章主要介绍了关于springboot-starter-undertow和tomcat的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 模拟打印机排队打印效果

    模拟打印机排队打印效果

    本节主要介绍了模拟打印机排队打印效果的具体实现,感兴趣的朋友可以参考下
    2014-07-07
  • Jedis对redis的五大类型操作代码详解

    Jedis对redis的五大类型操作代码详解

    这篇文章主要介绍了Jedis对redis的五大操作代码详解,分别是字符串、列表、散列、集合、有序集合,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 带你粗略了解Java数组的使用

    带你粗略了解Java数组的使用

    这篇文章主要给大家介绍了关于Java中数组的定义和使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • JAVA一个快速排序实现代码

    JAVA一个快速排序实现代码

    排序有哪几种方法?请列举。并用JAVA实现一个快速排序.,需要的朋友可以参考下
    2017-02-02

最新评论