这是一个关于Java的zip文件的解压和压缩工具类,里面除了解压和压缩还有删除、copy等其他功能。
在Java开发中,经常会遇到上传下载,有可能就会遇到解压,于是我就封装了工具类,方便使用。
在本文中会用到“ant-1.9.7.jar”这个jar包,至于版本可以不是我这个哈。

public class FileOper {public static void copyDirectiory(String sourceDir, String targetDir) throws IOException {//新建目标目录(new File(targetDir)).mkdirs();//获取源文件夹当下的文件或目录File[] file = (new File(sourceDir)).listFiles();for (int i = 0; i < file.length; i++) {if (file[i].isFile()) {//源文件File sourceFile = file[i];//目标文件File targetFile = new File(new File(targetDir).getAbsolutePath() + File.separator + file[i].getName());copyFile(sourceFile, targetFile);}if (file[i].isDirectory()) {//准备复制的源文件夹String dir1 = sourceDir + file[i].getName();//准备复制的目标文件夹String dir2 = targetDir + File.separator + file[i].getName();copyDirectiory(dir1, dir2);}}}public static void copyFile(File sourcefile, File targetFile) throws IOException {//新建文件输入流并对它进行缓冲FileInputStream input = new FileInputStream(sourcefile);BufferedInputStream inbuff = new BufferedInputStream(input);//新建文件输出流并对它进行缓冲FileOutputStream out = new FileOutputStream(targetFile);BufferedOutputStream outbuff = new BufferedOutputStream(out);//缓冲数组byte[] b = new byte[1024 * 5];int len = 0;while ((len = inbuff.read(b)) != -1) {outbuff.write(b, 0, len);}//刷新此缓冲的输出流outbuff.flush();//关闭流inbuff.close();outbuff.close();out.close();input.close();}/*** 递归删除目录下的所有文件及子目录下所有文件** @param dir 将要删除的文件目录* @return boolean Returns "true" if all deletions were successful.* If a deletion fails, the method stops attempting to* delete and returns "false".*/public static boolean deleteDir(File dir) {if (dir.isDirectory()) {String[] children = dir.list();//递归删除目录中的子目录下for (int i = 0; i < children.length; i++) {boolean success = deleteDir(new File(dir, children[i]));if (!success) {return false;}}}// 目录此时为空,可以删除return dir.delete();}/*** 压缩zip格式文件** @param targetFile  输出的文件。* @param sourceFiles 带压缩的文件数组。* @return 如果所有文件压缩成功,则返回true;如果有任何文件未成功压缩,则返回false。* @throws IOException 如果出错后无法删除目标文件或无法覆盖目标文件。*/public static boolean compressZip(File targetFile, File... sourceFiles) throws IOException {ZipOutputStream zipOut;boolean flag;if (targetFile.exists() && !targetFile.delete()) {throw new IOException();}try {zipOut = new ZipOutputStream(new FileOutputStream(targetFile));BufferedOutputStream out = new BufferedOutputStream(zipOut);flag = compressZip(zipOut, out, "", sourceFiles);out.close();zipOut.close();} catch (IOException e) {targetFile.delete();throw new IOException(e);}return flag;}private static boolean compressZip(ZipOutputStream zipOut, BufferedOutputStream out, String filePath, File... sourceFiles)throws IOException {if (null != filePath && !"".equals(filePath)) {filePath += filePath.endsWith(File.separator) ? "" : File.separator;} else {filePath = "";}boolean flag = true;for (File file : sourceFiles) {if (null == file) {continue;}if (file.isDirectory()) {File[] fileList = file.listFiles();if (null == fileList) {return false;} else if (1 > fileList.length) {zipOut.putNextEntry(new ZipEntry(filePath + file.getName() + File.separator));} else {flag = compressZip(zipOut, out, filePath + File.separator + file.getName(), fileList) && flag; // 只要flag有一次为false,整个递归的结果都为false。}} else {zipOut.putNextEntry(new ZipEntry(filePath + file.getName()));BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));int bytesRead;while (-1 != (bytesRead = in.read())) {out.write(bytesRead);}in.close();}out.flush();}return flag;}/*** 解压zip格式文件** @param originFile zip文件。* @param targetDir  要解压到的目标路径。* @return 如果目标文件不是zip文件则返回false。* @throws IOException 如果发生I/O错误。*/public static boolean decompressZip(File originFile, String targetDir) throws IOException {if (FileType.ZIP != getFileType(originFile)) {return false;}if (!targetDir.endsWith(File.separator)) {targetDir += File.separator;}ZipFile zipFile = new ZipFile(originFile);ZipEntry zipEntry;Enumeration<ZipEntry> entry = zipFile.getEntries();while (entry.hasMoreElements()) {zipEntry = entry.nextElement();String fileName = zipEntry.getName();File outputFile = new File(targetDir + fileName);if (zipEntry.isDirectory()) {forceMkdirs(outputFile);continue;} else if (!outputFile.getParentFile().exists()) {forceMkdirs(outputFile.getParent());}OutputStream outputStream = new FileOutputStream(outputFile);InputStream inputStream = zipFile.getInputStream(zipEntry);int len;byte[] buffer = new byte[8192];while (-1 != (len = inputStream.read(buffer))) {outputStream.write(buffer, 0, len);}outputStream.close();inputStream.close();}zipFile.close();return true;}/*** 获取文件真实类型** @param file 要获取类型的文件。* @return 文件类型枚举。*/public static FileType getFileType(File file) throws IOException {InputStream inputStream = new FileInputStream(file);byte[] head = new byte[4];if (-1 == inputStream.read(head)) {return FileType.UNKNOWN;}inputStream.close();int headHex = 0;for (byte b : head) {headHex <<= 8;headHex |= b;}switch (headHex) {case 0x504B0304:return FileType.ZIP;default:return FileType.UNKNOWN;}}public static void decompressTar(String tar, String desc) {int resultCode;try {String command = "tar -xf " + tar + " -C " + desc;resultCode = new ProcessUtil().execute(command);} catch (IOException  | InterruptedException e) {// 异常处理  或许打印  或许统一处理}if (resultCode != 0) {// 异常处理  或许打印  或许统一处理}}public static String convertCygwinPath(String path) {path = path.replaceAll("\\\\", "/");if (System.getProperty("os.name").toLowerCase().contains("win"))path = "/cygdrive/" + path.replaceFirst(":", "");return path;}@SuppressWarnings("ResultOfMethodCallIgnored")public static File forceMkdirs(File file) {if (!file.exists()) {file.mkdirs();} else if (!file.isDirectory()) {file.delete();file.mkdirs();}return file;}public static File forceMkdirs(String pathName) {return forceMkdirs(new File(pathName));}public static File forceMkdirs(File parent, String child) {return forceMkdirs(new File(parent, child));}public static File forceMkdirs(String parent, String child) {return forceMkdirs(new File(parent, child));}
}

到这里就OK啦,如果有什么疑问或者有什么意见欢迎在下方留言~

踏实一些,不要着急,你想要的,岁月都会给你。

Java实现Zip文件的解压和压缩_ZipUtil相关推荐

  1. iOS如何处理zip文件,解压或者压缩?

    在iOS开发中,我们有时会碰到解压Zip文件,或者压缩成Zip文件的需求! ZipArchive是一个开源的工具包,以下是配置步骤: 1. 首先下载ZipArchive,下载地址:http://zip ...

  2. ZIP文件夹解压小程序

    第1关:ZIP文件夹解压小程序之文件压缩 任务描述 相关知识 编程要求 测试说明 任务描述 本关任务:实现压缩文件或文件夹的功能. 相关知识 ZIP 是一种较为常见的压缩形式,在 Java 中要想实现 ...

  3. android下zip压缩文件加密解密的完美解决方案,Android之zip文件加密解压及进度条的实现...

    zip文件的解压可以使用java的zip库,但是没有实现对加密文件的解压功能,这里可以使用zip4j来实现.具体可以参看该文<Android下zip压缩文件加密解密的完美解决方案 http:// ...

  4. 压缩包下载后php文件怎么打开,用户下载的压缩包rar格式或zip文件如何解压 解压后就可以安装或运行里面的文件了...

    狸窝网盘中分享有很多解决方案中使用到的软件资源,下载到电脑后是一个软件的文件压缩包,有的用户下载后不知道如何解压或说解压不了,怎么办?由于狸窝所面向用户比较大众化,为方便不同年龄层次和新手的使用,这里 ...

  5. 使用java程序下载远程zip文件并解压文件( 带注释解释代码)

    带注释解释代码 package com.zcl.Test;import java.io.*; import java.net.HttpURLConnection; import java.net.So ...

  6. mac java打包文件_解压MAC压缩的zip文件

    import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import ...

  7. Mac上zip,rar,tar文件命令解压和压缩

    经常遇到在windowns上的压缩文件,在mac上解压出现问题,特意总结了下在Terminal里常用命令的方式解压和压缩文件 1.zip压缩文件 zip命令的参数很多,可以利用"zip -- ...

  8. linux zip命令(解压,压缩)

    对于zip linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序.它们的参数选项很多, 这里只做简单介绍,举例说明一下其用法: [root@localhost ~]# un ...

  9. 麒麟操作系统iso文件中的img文件的解压与压缩

      近日考虑到要制作适用PXE的引导麒麟系统,所以需要对iso中的img文件做适当调整.本文将介绍如何解压压缩麒麟系统的img文件. 一.了解vmlinuz和initrd.img文件 vmlinuz: ...

最新文章

  1. 醉酒删库:几杯红酒下肚,7小时数据消失...
  2. Keras运行代码时出现的问题及解决方法
  3. Android VNC Server
  4. win7下ffmpeg编译动态链接库整理
  5. C语言(CED)如何用sort函数根据结构体里的某一属性进行排序
  6. mysql求和 子查询_MYSQL 查询方法 统计查询 链接查询 子查询
  7. Django-ModelFrom中修改save后的字段值
  8. 文献阅读:《Generative Adversarial Active Learning for Unsupervised Outlier Detection》-2020 trans
  9. 201521123059 《Java程序设计》第三周学习总结
  10. html字体加载太慢,字体加载CSS @font-face性能优化的常用策略
  11. bugku之江湖魔头
  12. IstioCon 2022 报名中|使用 eBPF 代替 iptable 加速 Istio 数据平面
  13. java 项目的部署方案
  14. 互联网架构的演进方向
  15. MySQL数据库基础详解(非原创)
  16. 关于企业邮箱域名备案方法
  17. 【战神引擎】设置GM管理员账号
  18. macOS、Linux CentOS 、Docker安装部署canal-server(canal-deployer)服务
  19. 汉字 字库压缩ttf
  20. 什么是Cherry-Pick IDEA中怎么使用Cherry-Pick

热门文章

  1. 计算机有哪些应用领域,计算机的应用领域有哪些
  2. 计算机绘图二维三维实用教程,计算机绘图二维三维实用教程教学课件作者王建勇第二章.ppt...
  3. 二选一选择器-verilog
  4. 怎么看linux系统中是否安装pgf90,WRF模式学习_从linux安装开始
  5. swift 顶部提示图_古老的蜡烛图分析法-酒田战法的五种经典法则
  6. 神经网络 mse一直不变_卷积神经网络中十大拍案叫绝的操作
  7. Electerm for Mac(终端模拟器/免费ssh客户端)
  8. 中国黑客档案:黑客近景写真(1)
  9. 如何判断系统 是ios还是 android
  10. php选课系统,GitHub - kidaze/CourseSelectionSystem: 基于PHP的简易网上选课系统,实现管理员、老师、学生三种身份不同需求的php简易网上选课系统。...