用Java进行zip文件压缩与解压缩
程序员文章站
2022-06-17 11:41:04
可能存在的业务情况:1、用户上传了压缩包,需校验压缩包中的文件是否合格。2、用户上传压缩包,对压缩包中的文件进行批量水印处理解决思路:1、读取原压缩包文件,解压缩至临时目录2、对临时目录中的解压缩文件...
可能存在的业务情况:
1、用户上传了压缩包,需校验压缩包中的文件是否合格。
2、用户上传压缩包,对压缩包中的文件进行批量水印处理
解决思路:
1、读取原压缩包文件,解压缩至临时目录
2、对临时目录中的解压缩文件进行校验/水印处理
3、对临时目录中处理过的文件进行压缩
4、删除临时目录及其下的文件
需要参考前面的校验pdf的帖子
测试结果如下:
测试代码:
@test public void testzip() { string filepath = "d:\\pdftest\\合格压缩文件.zip"; // 获取原文所在目录 // 服务器上时,文件路径为“/”,此处测试需要换成filepath中的“\\” //string oldfilepath = filepath.substring(0, filepath.lastindexof("/")); string oldfilepath = filepath.substring(0, filepath.lastindexof("\\")); system.out.println("原文件路径:" + oldfilepath); // 临时目录,原压缩文件解压目录 string destdirpath = oldfilepath + "\\tmp\\"; system.out.println("临时路径:" + destdirpath); // 将原压缩文件解压到临时目录 ziputil.unzipfile(filepath, destdirpath); // 临时目录文件对象 file destdir = new file(destdirpath); // 获取临时目录下的所有文件 file[] files = destdir.listfiles(); // 定义变量,保存校验结果 list<integer> list = new arraylist<>(); // 遍历文件,进行校验 for (file file: files) { string absolutepath = file.getabsolutepath(); system.out.println(absolutepath); int i = checkpdfhelper.checkpdf(absolutepath); list.add(i); // 压缩包中存在不合格pdf文件时 if (i != 0) { break; } } // 判断是否包含不合格pdf文件 if (list.contains(1)) { system.out.println("压缩文件中包含不合格pdf文件"); // 删除解压缩的文件和临时目录 ziputil.deletefile(destdirpath); // 不合格时,不生成新的压缩包文件 return; } else { system.out.println("压缩文件pdf文件均符合要求"); } // 获取原压缩文件后缀 int pos = filepath.lastindexof('.'); string suffix = filepath.substring(pos + 1); // 新生成压缩文件路径 string newfilepath = filepath.substring(0, pos) + ".psw." + suffix; system.out.println("新的压缩文件路径:" + newfilepath); // 将检验成功的文件压缩成一个新的压缩包 ziputil.zipfile(newfilepath, files); // 删除临时目录 ziputil.deletefile(destdirpath); }
ziputil工具类:
package com.alphajuns.util; import java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.util.arraylist; import java.util.enumeration; import java.util.list; import org.apache.tools.zip.zipentry; import org.apache.tools.zip.zipfile; import org.apache.tools.zip.zipoutputstream; /** * @classname ziputil * @description 压缩或解压缩zip:由于直接使用java.util.zip工具包下的类,会出现中文乱码问题,所以使用ant.jar中的org.apache.tools.zip下的工具类 * @author alphajuns * @date 2020/3/8 11:30 * @version 1.0 */ public class ziputil { /** * @author alphajuns * @date 11:32 2020/3/8 * @description * @param zip 压缩目的地址 * @param srcfiles 压缩的源文件 * @return void */ public static void zipfile( string zip , file[] srcfiles ) { try { if( zip.endswith(".zip") || zip.endswith(".zip") ){ fileoutputstream fos = new fileoutputstream(new file(zip)); zipoutputstream _zipout = new zipoutputstream(fos) ; _zipout.setencoding("gbk"); for( file _f : srcfiles ){ handlerfile(zip , _zipout , _f , ""); } fos.close(); _zipout.close(); }else{ system.out.println("target file[" + zip + "] is not .zip type file"); } } catch (filenotfoundexception e) { } catch (ioexception e) { } } /** * @author alphajuns * @date 11:33 2020/3/8 * @description * @param zip 压缩的目的地址 * @param zipout * @param srcfile 被压缩的文件信息 * @param path 在zip中的相对路径 * @return void */ private static void handlerfile(string zip , zipoutputstream zipout , file srcfile , string path) throws ioexception { system.out.println(" begin to compression file[" + srcfile.getname() + "]"); if( !"".equals(path) && ! path.endswith(file.separator)){ path += file.separator ; } if( ! srcfile.getpath().equals(zip) ){ if( srcfile.isdirectory() ){ file[] _files = srcfile.listfiles() ; if( _files.length == 0 ){ zipout.putnextentry(new zipentry( path + srcfile.getname() + file.separator)); zipout.closeentry(); }else{ for( file _f : _files ){ handlerfile( zip ,zipout , _f , path + srcfile.getname() ); } } }else{ inputstream _in = new fileinputstream(srcfile) ; zipout.putnextentry(new zipentry(path + srcfile.getname())); int len = 0 ; byte[] _byte = new byte[1024]; while( (len = _in.read(_byte)) > 0 ){ zipout.write(_byte, 0, len); } _in.close(); zipout.closeentry(); } } } /** * @author alphajuns * @date 11:34 2020/3/8 * @description 解压缩zip文件,将zip文件里的内容解压到targetdir目录下 * @param zippath 待解压缩的zip文件名 * @param descdir 目标目录 * @return java.util.list<java.io.file> */ public static list<file> unzipfile(string zippath, string descdir) { return unzipfile(new file(zippath) , descdir) ; } /** * @author alphajuns * @date 11:36 2020/3/8 * @description 对.zip文件进行解压缩 * @param zipfile 解压缩文件 * @param descdir 压缩的目标地址,如:d:\\测试 或 /mnt/d/测试 * @return java.util.list<java.io.file> */ @suppresswarnings("rawtypes") public static list<file> unzipfile(file zipfile, string descdir) { list<file> _list = new arraylist<file>() ; try { zipfile _zipfile = new zipfile(zipfile , "gbk") ; for( enumeration entries = _zipfile.getentries() ; entries.hasmoreelements() ; ){ zipentry entry = (zipentry)entries.nextelement() ; file _file = new file(descdir + file.separator + entry.getname()) ; if( entry.isdirectory() ){ _file.mkdirs() ; }else{ file _parent = _file.getparentfile() ; if( !_parent.exists() ){ _parent.mkdirs() ; } inputstream _in = _zipfile.getinputstream(entry); outputstream _out = new fileoutputstream(_file) ; int len = 0 ; byte[] _byte = new byte[1024]; while( (len = _in.read(_byte)) > 0){ _out.write(_byte, 0, len); } _in.close(); _out.flush(); _out.close(); _list.add(_file) ; } } } catch (ioexception e) { } return _list ; } /** * @author alphajuns * @date 11:36 2020/3/8 * @description 对临时生成的文件夹和文件夹下的文件进行删除 * @param delpath * @return void */ public static void deletefile(string delpath) { try { file file = new file(delpath); if (!file.isdirectory()) { file.delete(); } else if (file.isdirectory()) { string[] filelist = file.list(); for (int i = 0; i < filelist.length; i++) { file delfile = new file(delpath + file.separator + filelist[i]); if (!delfile.isdirectory()) { delfile.delete(); } else if (delfile.isdirectory()) { deletefile(delpath + file.separator + filelist[i]); } } file.delete(); } } catch (exception e) { e.printstacktrace(); } } }
以上就是用java进行zip文件压缩与解压缩的详细内容,更多关于java zip文件压缩与解压缩的资料请关注其它相关文章!
上一篇: 用Python实现职工信息管理系统
下一篇: 梨可以做什么美食?你知道吗?