在工作中,我们或多或少都会接触到文件的压缩和解压,在window系统中,我们只需下载一个能对文件进行解压缩的应用即可,但如果让我们自己动手写对文件压缩的代码,顿时就头大了。

在java中,我们都知道输入流和输出流,其实还有压缩流(即:ZipOutPutStream)是专门对文件进行压缩的一个类。在jdk的api中是这样介绍的:

  • 该类实现了以ZIP文件格式写入文件的输出流过滤器。 包括对压缩和未压缩条目的支持

话不多说,直接上代码:

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;/*** ZipUtils* 文件压缩工具类*/public class ZipUtils {private static final int BUFFER_SIZE = 2 * 1024;/*** 压缩成ZIP 方法1* @param srcDir 压缩文件夹路径* @param out 压缩文件输出流* @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)* @throws RuntimeException 压缩失败会抛出运行时异常*/public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure) throws RuntimeException {long start = System.currentTimeMillis();ZipOutputStream zos = null;try {zos = new ZipOutputStream(out);File sourceFile = new File(srcDir);compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure);long end = System.currentTimeMillis();log.debug("压缩完成,耗时:" + (end - start) + " ms");} catch (Exception e) {throw new RuntimeException("zip error from ZipUtils", e);} finally {if (zos != null) {try {zos.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 压缩成ZIP 方法2* @param srcFiles 需要压缩的文件列表* @param out 压缩文件输出流* @throws RuntimeException 压缩失败会抛出运行时异常*/public static void toZip(List<File> srcFiles, OutputStream out) throws RuntimeException {long start = System.currentTimeMillis();ZipOutputStream zos = null;try {zos = new ZipOutputStream(out);for (File srcFile : srcFiles) {byte[] buf = new byte[BUFFER_SIZE];zos.putNextEntry(new ZipEntry(srcFile.getName()));int len;FileInputStream in = new FileInputStream(srcFile);while ((len = in.read(buf)) != -1) {zos.write(buf, 0, len);}zos.closeEntry();in.close();}long end = System.currentTimeMillis();System.out.println("压缩完成,耗时:" + (end - start) + " ms");} catch (Exception e) {throw new RuntimeException("zip error from ZipUtils", e);} finally {if (zos != null) {try {zos.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 递归压缩方法* @param sourceFile 源文件* @param zos zip输出流* @param name 压缩后的名称* @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)* @throws Exception*/private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean KeepDirStructure)throws Exception {byte[] buf = new byte[BUFFER_SIZE];if (sourceFile.isFile()) {// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字zos.putNextEntry(new ZipEntry(name));// copy文件到zip输出流中int len;FileInputStream in = new FileInputStream(sourceFile);while ((len = in.read(buf)) != -1) {zos.write(buf, 0, len);}// Complete the entryzos.closeEntry();in.close();} else {File[] listFiles = sourceFile.listFiles();if (listFiles == null || listFiles.length == 0) {// 需要保留原来的文件结构时,需要对空文件夹进行处理if (KeepDirStructure) {// 空文件夹的处理zos.putNextEntry(new ZipEntry(name + "/"));// 没有文件,不需要文件的copyzos.closeEntry();}} else {for (File file : listFiles) {// 判断是否需要保留原来的文件结构if (KeepDirStructure) {// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了compress(file, zos, name + "/" + file.getName(), KeepDirStructure);} else {compress(file, zos, file.getName(), KeepDirStructure);}}}}}public static void main(String[] args) throws Exception {/** 测试压缩方法1 *//*  FileOutputStream fos1 = new FileOutputStream(new File("D:\\test\\back.zip"));ZipUtils.toZip("D:\\test\\back", fos1, true);*/// 测试压缩方法2 /*List<File> fileList = new ArrayList<>();fileList.add(new File("D:\\test\\exp\\sms\\exp_dr_sms_102_00000001.data"));fileList.add(new File("D:\\test\\exp\\sms\\exp_dr_sms_102_00000002.data"));fileList.add(new File("D:\\test\\exp\\sms\\exp_dr_sms_102_00000003.data"));FileOutputStream fos2 = new FileOutputStream(new File("D:\\test\\exp\\sms\\exp_dr_sms_102a.zip"));ZipUtils.toZip(fileList, fos2);}
}

以上的内容就是对文件进行压缩的两种方法;

java对文件进行压缩的两种方法相关推荐

  1. java 图片压缩100k_Java 实现图片压缩的两种方法

    问题背景. 典型的情景:Nemo社区中,用户上传的图片免不了要在某处给用户做展示. 如用户上传的头像,那么其他用户在浏览该用户信息的时候,就会需要回显头像信息了. 用户上传的原图可能由于清晰度较高而体 ...

  2. JavaBean实现多个文件上传的两种方法

    JavaBean实现多个文件上传的两种方法 王新芳        刘杰 北京工商大学计算机学院 摘要:本文介绍了JavaBean实现多个文件上传的两种方法,分别是使用http协议和ftp协议实现.首先 ...

  3. Java生成二维码的两种方法

    本文介绍Java生成二维码的两种方法,这两种方法都依赖于google提供的二维码依赖包. 一种是自己写工具类,代码可以网上抄. 另一种是使用hutool第三方工具类的依赖包,不用自己抄代码. 一.自定 ...

  4. Java中的string定义的两种方法和区别

    java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...

  5. MATLAB 保存imshow绘制图片到指定文件夹中的两种方法

    MATLAB 保存imshow绘制图片到指定文件夹中的两种方法 imwrite函数 imwrite(image,filename) imwrite(image,filename)是将图像数据image ...

  6. SketchUp 2019 文件导入AI的两种方法(附插件)

    作者:TutorialsUp 今天与大家分享TutorialsUp教程 将SketchUp文件导入AI的两种方法 作者通过两种方式,完美地将SU文件导入AI进行编辑. 第一种方法是SketchUp原生 ...

  7. 设置ZIP文件打开密码的两种方法

    使用WinRAR缩包ZIP文件时,有两种方式来设置打开密码,我们可以根据不同需要选择不同的方法. 方法一: 在压缩文件的时候同时设置打开密码,只设置当下压缩的ZIP文件. 首先,鼠标选择需要压缩的文件 ...

  8. Java 跨平台获取 MAC 地址的两种方法

    前言 有时我们因为软件授权或者其它需要获取主机唯一标识而需要获取用户主机的MAC地址,而本文则将介绍如何通过Java来实现跨平台获取MAC地址的两种方法,同时具体的代码也已上传到GitHub. 如果不 ...

  9. 提取pdf文件中文字的两种方法

    如今,在我们的工作与学习中已经不是单单使用word.Excel等格式文件了,pdf格式的文件已经被广泛地运用到我们的办公室中.大家都知道pdf文件是不可直接编辑与修改的,使用起来有些不便.那么当我们需 ...

最新文章

  1. 调包侠福音!机器学习经典算法开源教程(附参数详解及代码实现)
  2. Tesseract使用日记
  3. Centos用cron定时执行PHP
  4. 什么是 Silverlight?
  5. 2017年我的阅读书单
  6. mysql去掉小数点多余0_mysql数据库个性化需求:版本号排序
  7. 东南亚再造天猫 Lazada品牌商城LazMall举办第二届品牌未来论坛
  8. 好婚姻必定是灵魂佳偶
  9. vue组件穿方法_vue组件中的数据传递方法
  10. 【AIX】AIX 开机自动挂载NFS共享
  11. Java集合---ConcurrentHashMap原理分析
  12. 博文视点Open Party ——漏洞分析
  13. 入门OJ:photo
  14. VS2010 visual studio Microsoft 应用程序错误报告 Microsoft Application Error Reporting 下列组件安装失败 1603 1935解决方法
  15. win7系统下C盘扩容
  16. php里用钢笔画曲线,ps钢笔工具组怎么用 ps钢笔工具使用方法
  17. iOS 此应用需要开发者更新以在此ios版本上运行
  18. 1428D - Bouncing Boomerangs(思维+构造+贪心)
  19. 孙溟㠭篆刻《天地宽》
  20. STM32CubeMX 创建CustomHID设备

热门文章

  1. Ubuntu tcpdump详解
  2. 中图分类号和UDC查询
  3. 三星s7edge手机无法连接adb问题
  4. 时间窗口(Time Windows)的原理和使用
  5. python plt legend并排_matplotlib如何控制legend的位置之二
  6. 高级灰+中国红,这才是家应该有的样子
  7. Python 1 数据类型介绍
  8. 【热血传奇】 怪物添加(上)
  9. Firefox 2.0密码管理Bug会泄漏密码
  10. windows下禁用时间同步(防止自动变回来)