java 压缩/解压 zip 多个文件和文件夹
2018-03-12 09:58
691 查看
参考了几篇文章,基本都是压缩单个文件或者一个文件夹,不能混合压缩。
找了一个不需要额外jar包的代码上改的。(参考文章)
不需要额外jar包。
压缩方法:
解压
找了一个不需要额外jar包的代码上改的。(参考文章)
不需要额外jar包。
压缩方法:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipUtil { private static final int BUFFER_SIZE = 2 * 1024; /** * @param srcDir 压缩文件夹路径 * @param out 压缩文件输出流 * @param KeepDirStructure 是否保留原来的目录结构, * true:保留目录结构; * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败) * @throws RuntimeException 压缩失败会抛出运行时异常 */ public static void toZip(String[] srcDir, String outDir, boolean KeepDirStructure) throws RuntimeException, Exception { OutputStream out = new FileOutputStream(new File(outDir)); long start = System.currentTimeMillis(); ZipOutputStream zos = null; try { zos = new ZipOutputStream(out); List<File> sourceFileList = new ArrayList<File>(); for (String dir : srcDir) { File sourceFile = new File(dir); sourceFileList.add(sourceFile); } compress(sourceFileList, zos, KeepDirStructure); long< 4000 /span> 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()) { zos.putNextEntry(new ZipEntry(name)); int len; FileInputStream in = new FileInputStream(sourceFile); while ((len = in.read(buf)) != -1) { zos.write(buf, 0, len); } // Complete the entry zos.closeEntry(); in.close(); } else { File[] listFiles = sourceFile.listFiles(); if (listFiles == null || listFiles.length == 0) { if (KeepDirStructure) { zos.putNextEntry(new ZipEntry(name + "/")); zos.closeEntry(); } } else { for (File file : listFiles) { if (KeepDirStructure) { compress(file, zos, name + "/" + file.getName(), KeepDirStructure); } else { compress(file, zos, file.getName(), KeepDirStructure); } } } } } private static void compress(List<File> sourceFileList, ZipOutputStream zos, boolean KeepDirStructure) throws Exception { byte[] buf = new byte[BUFFER_SIZE]; for (File sourceFile : sourceFileList) { String name = sourceFile.getName(); if (sourceFile.isFile()) { zos.putNextEntry(new ZipEntry(name)); int len; FileInputStream in = new FileInputStream(sourceFile); while ((len = in.read(buf)) != -1) { zos.write(buf, 0, len); } zos.closeEntry(); in.close(); } else { File[] listFiles = sourceFile.listFiles(); if (listFiles == null || listFiles.length == 0) { if (KeepDirStructure) { zos.putNextEntry(new ZipEntry(name + "/")); zos.closeEntry(); } } else { for (File file : listFiles) { if (KeepDirStructure) { compress(file, zos, name + "/" + file.getName(), KeepDirStructure); } else { compress(file, zos, file.getName(), KeepDirStructure); } } } } } } public static void main(String[] args) throws Exception { String[] srcDir = { "C:\\Users\\LiuHY\\Desktop\\java", "C:\\Users\\LiuHY\\Desktop\\java2", "C:\\Users\\LiuHY\\Desktop\\fortest.txt" }; String outDir = "C:\\Users\\LiuHY\\Desktop\\aaa.zip"; ZipUtil.toZip(srcDir, outDir, true); } }
解压
/** * * @Description (解压) * @param zipPath zip路径 * @param charset 编码 * @param outPutPath 输出路径 */ public static void decompression(String zipPath, String charset, String outPutPath) { long startTime=System.currentTimeMillis(); try { ZipInputStream Zin=new ZipInputStream(new FileInputStream(zipPath), Charset.forName(charset));//输入源zip路径 BufferedInputStream Bin=new BufferedInputStream(Zin); String Parent = outPutPath; //输出路径(文件夹目录) File Fout=null; ZipEntry entry; try { while((entry = Zin.getNextEntry())!=null && !entry.isDirectory()){ Fout=new File(Parent,entry.getName()); if(!Fout.exists()){ (new File(Fout.getParent())).mkdirs(); } FileOutputStream out=new FileOutputStream(Fout); BufferedOutputStream Bout=new BufferedOutputStream(out); int b; while((b=Bin.read())!=-1){ Bout.write(b); } Bout.close(); out.close(); System.out.println(Fout+"解压成功"); } Bin.close(); Zin.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } long endTime=System.currentTimeMillis(); System.out.println("耗费时间: "+(endTime-startTime)+" ms"); }
相关文章推荐
- java压缩及解压(.zip)文件文件夹
- java zip和rar压缩文件的解压
- JAVA实现把指定文件夹下的所有文件压缩成zip包
- java 实现对文件文件夹压缩、解压
- java中不解压读取zip压缩文件
- Java 解压和压缩文件(文件夹)
- java.util.zip包无法正常解压rar软件压缩的rar文件
- Java将指定文件/文件夹压缩成zip、rar压缩文件
- JAVA读取zip文件 JAVA读取压缩文件 解压zip里面的指定格式文件
- JAVA 文件处理 压缩文件或文件夹 ZipOutputStream ZipEntry 文件处理
- java.util.zip 的解压和压缩文件夹
- java将文件夹中的多个文件(包含子文件夹)压缩成zip文件
- C#多级文件夹及文件的zip压缩解压
- 跨平台的zip文件压缩处理,支持压缩解压文件夹
- java 压缩、解压文件、文件夹。
- 使用java.util.zip压缩、解压文件
- java使用Apache的ant压缩和解压文件(zip)
- 利用java的ZipOutputStream类压缩文件,解压文件或文件夹中的文件
- Java解压和压缩带密码的zip文件
- java解压zip或rar压缩文件(有源码和jar包以及对中文乱码的处理方法)