精华内容
下载资源
问答
  • java压缩zip
    千次阅读
    2022-03-23 22:04:34
    import java.util.zip.ZipOutputStream;
    import java.io.FileOutputStream;
    import java.nio.charset.Charset;
    
    FileOutputStream fos = new FileOutputStream("src/main/resources/dirCompressed.zip");
    
    // ❗❗❗指定编码可以避免因为环境配置的问题导致的文件名乱码
    ZipOutputStream zipOut = new ZipOutputStream(fos, Charset.forName("utf-8"));
    

    网上有很多文章要添加jar包依赖
    例如:

    • https://blog.csdn.net/u013241093/article/details/82526097
    • https://www.cnblogs.com/stono/p/6736329.html

    在JDK8之前java自带的ZipOutputStream方法确实没有解决该乱码问题,
    之后可以通过java原生的ZipOutputStream指定编码格式来解决乱码问题.

    更多相关内容
  • 主要介绍了java压缩zip文件中文乱码问题的解决方法,需要的朋友可以参考下
  • 主要介绍了Java8 Zip 压缩与解压缩的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Java实现Zip压缩文件操作的工具类 文章介绍:https://blog.csdn.net/rongbo91/article/details/117747042 (可作为Jar依赖包直接使用) 1、项目使用前,请进入rdc-bom目录下,执行mvn clean install命令  2、可...
  • 主要介绍了Java解压和压缩带密码的zip文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们来学习一下吧
  • java压缩ZIP格式源码,仅供参考。
  • Java 1.1实现了I/O数据流与网络数据流的单一接口,因此数据的压缩、网络传输和解 压缩的实现比较容易,下面介绍利用ZipEntry、ZipInputStream和ZipOutputStream三个Java 类实现zip数据压缩方式的编程方法。 zip压缩...
  • 解决java压缩zip文件时的中文乱码问题 实现:java压缩文件成zip实现无乱码。 包括:写好的工具类与jar包。 使用方法:导入ant.jar包,调用CompressExcelOperate中的方法,即可实现压缩文件,并保证没有中文乱码...
  • 学习Java压缩zip文件:压缩单个文件和多个文件,不包含文件夹;怎样用Java将文件追加到zip文件中。测试类:/** * @FileName:ZipTest.java * @Description: TODO * @Copyright: All rights Reserved, Designed By ...

    学习Java压缩zip文件:

    1. 压缩单个文件和多个文件,不包含文件夹;
    2. 怎样用Java将文件追加到zip文件中。

    测试类:

    /**
     * @FileName:ZipTest.java
     * @Description: TODO
     * @Copyright: All rights Reserved, Designed By [meter] Copyright(C) 2010-2018
     * @Company: 
     * @author:meter
     * @version: V1.0 
     * @Create:2018年5月4日 上午9:50:22
     *
     * Modification  History:
     * Date         Author        Version        Discription
     * -----------------------------------------------------------------------------------
     * 2018年5月4日      meter          1.0             1.0
     * Why & What is modified: <修改原因描述>
     */
    package org.meter.demo;
    
    import java.io.File;
    import java.io.FileFilter;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Scanner;
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    import org.meter.zip.ZipTools;
    
    
    /**      
     * @项目名称:meter   
     * @类名称:ZipTest   
     * @类描述:   
     * @创建人:meter   
     * @创建时间:2018年5月4日 上午9:50:22   
     * @版权:Copyright@2018.All Rights Reserved    
     * @version v1.0      
     */
    public class ZipTest {
    	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmssSSSS");
    	private static ThreadPoolExecutor workerPool=new ThreadPoolExecutor(20,
    				25,
    				1,
    				TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(15),
    				new ThreadPoolExecutor.CallerRunsPolicy());
    		
    	private static void test(String path,Long size) throws Exception{
    		workerPool.allowCoreThreadTimeOut(true);// 设置超时时关闭线程
    		File dir=new File(path);
    		if(!dir.exists()){
    			System.out.println("当前路径:"+path+"不存在");
    			return;
    		}
    		System.out.println("当前路径:"+dir.getAbsolutePath());
    		File[] files =dir.listFiles(new FileFilter(){
    			@Override
    			public boolean accept(File pathname) {
    				if(pathname.getName().toLowerCase().endsWith(".zip")&&pathname.getName().toLowerCase().contains("sca_2018")){
    					return true;
    				}
    				return false;
    			}
    		});
    		long fileSize=0;
    		List<File> fileList=new ArrayList<File>();
    		String zipName="sca_"+sdf.format(new Date())+".zip";
    		int flag=files.length;
    		for(File file:files){
    			System.out.println("读取到文件:"+file.getName());
    			fileSize+=file.length();
    			fileList.add(file);
    			flag--;
    			if(fileSize>=size){
    				workerPool.execute(new InnerWorker(fileList,zipName));
    				fileSize=0;
    				fileList=new ArrayList<File>();
    				zipName="sca_"+sdf.format(new Date())+".zip";
    			} else if(flag<=0){
    				ZipTools.zipFiles(fileList,new File(zipName));
    			}
    		}
    	}
    
        
        private static class InnerWorker implements Runnable{
        	private List<File> fileList;
        	private String zipName;
        	public InnerWorker(List<File> fileList,String zipName){
        		this.fileList=fileList;
        		this.zipName=zipName;
        	}
        	
    		@Override
    		public void run() {
    			try {
    				ZipTools.zipFiles(fileList,new File(zipName));
    				System.out.println("压缩文件["+zipName+"]成功。");
    			} catch (Exception e) {
    				e.printStackTrace();
    				System.out.println("压缩失败文件:"+zipName);
    			}
    			
    		}
        	
        }
    	/** @创建日期:2018年5月4日 上午9:50:22
    	 * @作者: meter
    	 * @描述:TODO
    	 * @Title: main
    	 * @param args   
    	 * @throws Exception 
    	 */
    	public static void main(String[] args) throws Exception {
    		System.out.println("Please input the path:");
    		Scanner input = new Scanner(System.in);
    		String path=input.nextLine();
    		test(path,2147483648L);
    	}
    
    }
    

    工具类:

    /**
     * @FileName:ZipTools.java
     * @Description: TODO
     * @Copyright: All rights Reserved, Designed By [meter] Copyright(C) 2010-2018
     * @Company: 米特娱乐乐园
     * @author:meter
     * @version: V1.0 
     * @Create:2018年5月4日 上午10:25:09
     *
     * Modification  History:
     * Date         Author        Version        Discription
     * -----------------------------------------------------------------------------------
     * 2018年5月4日      meter          1.0             1.0
     * Why & What is modified: <修改原因描述>
     */
    package org.meter.zip;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.nio.charset.Charset;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    import java.util.zip.ZipOutputStream;
    
    
    
    /**
     * @项目名称:meter
     * @类名称:ZipTools 
     * @类描述:采用zip压缩文件
     * @创建人:meter
     * @创建时间:2018年5月4日 上午10:25:09
     * @版权:Copyright@2018.All Rights Reserved
     * @version v1.0
     */
    public class ZipTools {
    	/**
    	 * @创建日期:2018年5月4日 下午1:37:22
    	 * @作者: meter
    	 * @描述:压缩多个文件的情况
    	 * @Title: zip
    	 * @param fileList
    	 * @param zipFile
    	 * @throws Exception
    	 */
    	public static void zipFiles(List<File> fileList,File zipFile) throws Exception{
    		System.out.println("zipFiles待压缩文件:"+zipFile.getAbsolutePath());
    		if(fileList != null){
    			if(zipFile.exists()){//压缩文件已经存在,则只能单个添加
    				for(File file:fileList){
    					zip(zipFile,file);
    				}
    			}else{//不存在则新建
    				// 创建zip输出流
    				ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(zipFile), Charset.forName("UTF-8"));
    				// 创建缓冲输出流
    				BufferedOutputStream bufferOutStream = new BufferedOutputStream(zipOutStream);
    				for(File file:fileList){
    					zipFile(file,zipOutStream,bufferOutStream);
    				}
    				//最后关闭输出流
    				bufferOutStream.close();
    				zipOutStream.close();
    			}
    			
    		}
    	}
    	/**
    	 * @创建日期:2018年5月4日 下午1:44:55
    	 * @作者: meter
    	 * @描述:执行文件压缩
    	 * @Title: zipFile
    	 * @param file
    	 * @param zipOutStream
    	 * @param bufferOutStream
    	 * @throws IOException
    	 */
    	private static void zipFile(File file,ZipOutputStream zipOutStream,BufferedOutputStream bufferOutStream) throws IOException{
    		// 创建压缩文件实体
    		ZipEntry entry = new ZipEntry(file.getName());
    		// 添加实体
    		zipOutStream.putNextEntry(entry);
    		// 创建输入流
    		BufferedInputStream bufferInputStream = new BufferedInputStream(new FileInputStream(file));
    		write(bufferInputStream, bufferOutStream);
    		zipOutStream.closeEntry();
    	}
    	/**
    	 * @创建日期:2018年5月4日 下午1:37:01
    	 * @作者: meter
    	 * @描述:压缩单个文件
    	 * @Title: zip
    	 * @param zipFile
    	 * @param sourceFile
    	 * @throws Exception
    	 */
    	public static void zip(File zipFile, File sourceFile) throws Exception {
    		System.out.println("待压缩文件:"+zipFile.getAbsolutePath());
    		if (zipFile.exists()) {// 添加到已经存在的压缩文件中
    			
    			File tempFile=new File(zipFile.getAbsolutePath()+".tmp");
    			// 创建zip输出流
    			ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(tempFile), Charset.forName("UTF-8"));
    			// 创建缓冲输出流
    			BufferedOutputStream bufferOutStream = new BufferedOutputStream(zipOutStream);
    			ZipFile zipOutFile = new ZipFile(zipFile);
    			
    			Enumeration<? extends ZipEntry> entries = zipOutFile.entries();
    			while (entries.hasMoreElements()) {
    				ZipEntry entry = entries.nextElement();
    				System.out.println("copy: " + entry.getName());
    				zipOutStream.putNextEntry(entry);
    				if (!entry.isDirectory()) {
    					write(zipOutFile.getInputStream(entry), bufferOutStream);
    				}
    				zipOutStream.closeEntry();
    			}
    			zipOutFile.close();//记得关闭zip文件,否则后面无法删除原始文件
    			ZipEntry entry = new ZipEntry(sourceFile.getName());
    			// 添加实体
    			zipOutStream.putNextEntry(entry);
    			BufferedInputStream bufferInputStream = new BufferedInputStream(new FileInputStream(sourceFile));
    			write(bufferInputStream, bufferOutStream);
    			//最后关闭输出流
    			bufferOutStream.close();
    			zipOutStream.close();
    			boolean flag=zipFile.delete();
    			if(flag){
    			tempFile.renameTo(zipFile);
    			}else{
    				System.out.println("删除文件失败。");
    			}
    		} else {// 新创建压缩文件
    			// 创建zip输出流
    			ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(zipFile), Charset.forName("UTF-8"));
    			// 创建缓冲输出流
    			BufferedOutputStream bufferOutStream = new BufferedOutputStream(zipOutStream);
    			// 创建压缩文件实体
    			ZipEntry entry = new ZipEntry(sourceFile.getName());
    			// 添加实体
    			zipOutStream.putNextEntry(entry);
    			// 创建输入流
    			BufferedInputStream bufferInputStream = new BufferedInputStream(new FileInputStream(sourceFile));
    			write(bufferInputStream, bufferOutStream);
    			//最后关闭输出流
    			bufferOutStream.close();
    			zipOutStream.close();
    		}
    		
    	}
    	/**
    	 * @创建日期:2018年5月4日 下午2:09:37
    	 * @作者: meter
    	 * @描述:读写zip文件
    	 * @Title: write
    	 * @param inputStream
    	 * @param outStream
    	 * @throws IOException
    	 */
        private static void write(InputStream inputStream,OutputStream outStream) throws IOException{
        	byte[] data=new byte[4096];
        	int length=0;
        	while((length=inputStream.read(data)) != -1){
        		outStream.write(data,0,length);
        	}
        	outStream.flush();//刷新输出流
        	inputStream.close();//关闭输入流
        }
        
        /**
         * @创建日期:2018年5月4日 下午3:07:55
         * @作者: meter
         * @描述:压缩指定目录下所有文件
         * @Title: zipDirectory
         * @param dirFile
         * @param zipFile
         * @throws IOException 
         */
        public static void zipDirectory(File dirFile,File zipFile) throws IOException{
        	if(dirFile != null && dirFile.isDirectory()){
        		if(zipFile == null){
        			zipFile=new File(dirFile.getAbsolutePath()+".zip");
        		}
        		String dirName=dirFile.getName()+File.separator;
        		// 创建zip输出流
    			ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(zipFile), Charset.forName("UTF-8"));
    			// 创建缓冲输出流
    			BufferedOutputStream bufferOutStream = new BufferedOutputStream(zipOutStream);
    			dealDirFile( dirFile,dirName,bufferOutStream,zipOutStream);
    			
    			//最后关闭输出流
    			bufferOutStream.close();
    			zipOutStream.close();
        	}else{
        		System.out.println("["+dirFile.getName()+"]不是一个文件夹,或者不存在。");
        	}
        }
        /**
         * @创建日期:2018年5月4日 下午4:38:46
         * @作者: meter
         * @描述:处理目录文件
         * @Title: dealDirFile
         * @param dirFile
         * @param parentDir
         * @param bufferOutStream
         * @param zipOutStream
         * @throws IOException
         */
        private static void dealDirFile(File dirFile,String parentDir, BufferedOutputStream bufferOutStream, ZipOutputStream zipOutStream) throws IOException{
        	File[] fileList=dirFile.listFiles();
        	for(File file:fileList){
        		if(file.isFile()){
        			// 创建压缩文件实体
        			ZipEntry entry = new ZipEntry(parentDir+file.getName());
        			// 添加实体
        			zipOutStream.putNextEntry(entry);
        			// 创建输入流
        			BufferedInputStream bufferInputStream = new BufferedInputStream(new FileInputStream(file));
        			write(bufferInputStream, bufferOutStream);
        		}else{
        			dealDirFile(file,  parentDir+file.getName()+File.separator,  bufferOutStream,  zipOutStream);
        		}
        	}
        }
        /**
         * @创建日期:2018年5月4日 下午3:22:11
         * @作者: meter
         * @描述:重载zipDirectory
         * @Title: zipDirectory
         * @param dirPath
         * @param zipPath
         * @throws IOException
         */
        public static void zipDirectory(String dirPath,String zipPath) throws IOException{
        	if(zipPath==null || "".equals(zipPath)){
        		zipDirectory(new File(dirPath),null);
        	}else{
        		zipDirectory(new File(dirPath),new File(zipPath));
        	}
        }
       //------------------------------------------------米特华丽的分割线----------------------------------------------------------------------------------------
       
        /**
         * @创建日期:2018年5月4日 下午4:00:41
         * @作者: meter
         * @描述:解压文件
         * @Title: unzip
         * @param zipFile
         * @param destDir
         * @throws IOException 
         */
    	public static void unzip(File zipFile, File destDir) throws IOException {
    		ZipFile zipOutFile = new ZipFile(zipFile,Charset.forName("gbk"));
    		Enumeration<? extends ZipEntry> entries = zipOutFile.entries();
    		while (entries.hasMoreElements()) {
    			ZipEntry entry = entries.nextElement();
    			if(entry.isDirectory()){
    				File tempFile = new File(destDir.getAbsolutePath()+File.separator+entry.getName());
    				if (!tempFile.exists()) {
    					tempFile.mkdirs();
    				}
    			}else{
    				File tempFile=new File(destDir.getAbsolutePath()+File.separator+entry.getName());
    				checkParentDir(tempFile);
    				FileOutputStream fileOutStream=new FileOutputStream(tempFile);
    				BufferedOutputStream bufferOutStream = new BufferedOutputStream(fileOutStream);
    				write(zipOutFile.getInputStream(entry),bufferOutStream);
    				bufferOutStream.close();
    				fileOutStream.close();
    			}
    		}
    		zipOutFile.close();//记得关闭zip文件
    	}
    	
    	/**
    	 * @创建日期:2018年5月4日 下午4:37:41
    	 * @作者: meter
    	 * @描述:验证父目录是否存在,否则创建
    	 * @Title: checkParentDir
    	 * @param file
    	 */
    	private static void checkParentDir(File file){
    		if(!file.getParentFile().exists()){
    			file.getParentFile().mkdirs();
    		}
    	}
    	
    }
    


    展开全文
  • java 压缩zip文件

    千次阅读 2021-03-17 12:58:07
    import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;...

    package com.demo;

    import java.io.BufferedOutputStream;

    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.Enumeration;

    import org.apache.tools.zip.ZipEntry;

    import org.apache.tools.zip.ZipFile;

    import org.apache.tools.zip.ZipOutputStream;

    /** *//**

    * 压缩/解压缩zip包处理类

    *

    * @author

    * @date

    */

    public class ZipUtil {

    /** *//**

    * 压缩

    *

    * @param zipFileName

    *            压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名

    * @param relativePath

    *            相对路径,默认为空

    * @param directory

    *            文件或目录的绝对路径

    * @throws FileNotFoundException

    * @throws IOException

    * @author

    * @date

    */

    public static void zip(String zipFileName, String relativePath,

    String directory) throws FileNotFoundException, IOException {

    String fileName = zipFileName;

    if (fileName == null || fileName.trim().equals("")) {

    File temp = new File(directory);

    if (temp.isDirectory()) {

    fileName = directory + ".zip";

    } else {

    if (directory.indexOf(".") > 0) {

    fileName = directory.substring(0, directory

    .lastIndexOf("."))

    + "zip";

    } else {

    fileName = directory + ".zip";

    }

    }

    }

    ZipOutputStream zos = new ZipOutputStream(

    new FileOutputStream(fileName));

    try {

    zip(zos, relativePath, directory);

    } catch (IOException ex) {

    throw ex;

    } finally {

    if (null != zos) {

    zos.close();

    }

    }

    }

    /** *//**

    * 压缩

    *

    * @param zos

    *            压缩输出流

    * @param relativePath

    *            相对路径

    * @param absolutPath

    *            文件或文件夹绝对路径

    * @throws IOException

    * @author

    * @date

    */

    private static void zip(ZipOutputStream zos, String relativePath,

    String absolutPath) throws IOException {

    File file = new File(absolutPath);

    if (file.isDirectory()) {

    File[] files = file.listFiles();

    for (int i = 0; i < files.length; i++) {

    File tempFile = files[i];

    if (tempFile.isDirectory()) {

    String newRelativePath = relativePath + tempFile.getName()

    + File.separator;

    createZipNode(zos, newRelativePath);

    zip(zos, newRelativePath, tempFile.getPath());

    } else {

    zipFile(zos, tempFile, relativePath);

    }

    }

    } else {

    zipFile(zos, file, relativePath);

    }

    }

    /** *//**

    * 压缩文件

    *

    * @param zos

    *            压缩输出流

    * @param file

    *            文件对象

    * @param relativePath

    *            相对路径

    * @throws IOException

    * @author

    * @date

    */

    private static void zipFile(ZipOutputStream zos, File file,

    String relativePath) throws IOException {

    ZipEntry entry = new ZipEntry(relativePath + file.getName());

    zos.putNextEntry(entry);

    InputStream is = null;

    try {

    is = new FileInputStream(file);

    int BUFFERSIZE = 2 << 10;

    int length = 0;

    byte[] buffer = new byte[BUFFERSIZE];

    while ((length = is.read(buffer, 0, BUFFERSIZE)) >= 0) {

    zos.write(buffer, 0, length);

    }

    zos.flush();

    zos.closeEntry();

    } catch (IOException ex) {

    throw ex;

    } finally {

    if (null != is) {

    is.close();

    }

    }

    }

    /** *//**

    * 创建目录

    *

    * @param zos

    *            zip输出流

    * @param relativePath

    *            相对路径

    * @throws IOException

    * @author

    * @date

    */

    private static void createZipNode(ZipOutputStream zos, String relativePath)

    throws IOException {

    ZipEntry zipEntry = new ZipEntry(relativePath);

    zos.putNextEntry(zipEntry);

    zos.closeEntry();

    }

    /** *//**

    * 解压缩zip包

    *

    * @param zipFilePath

    *            zip文件路径

    * @param targetPath

    *            解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下

    * @throws IOException

    * @author

    * @date

    */

    public static void unzip(String zipFilePath, String targetPath)

    throws IOException {

    OutputStream os = null;

    InputStream is = null;

    ZipFile zipFile = null;

    try {

    zipFile = new ZipFile(zipFilePath);

    String directoryPath = "";

    if (null == targetPath || "".equals(targetPath)) {

    directoryPath = zipFilePath.substring(0, zipFilePath

    .lastIndexOf("."));

    } else {

    directoryPath = targetPath;

    }

    Enumeration entryEnum = zipFile.getEntries();

    if (null != entryEnum) {

    ZipEntry zipEntry = null;

    while (entryEnum.hasMoreElements()) {

    zipEntry = (ZipEntry) entryEnum.nextElement();

    if (zipEntry.isDirectory()) {

    directoryPath = directoryPath + File.separator

    + zipEntry.getName();

    System.out.println(directoryPath);

    continue;

    }

    if (zipEntry.getSize() > 0) {

    // 文件

    File targetFile = FileUtil.buildFile(directoryPath

    + File.separator + zipEntry.getName(), false);

    os = new BufferedOutputStream(new FileOutputStream(

    targetFile));

    is = zipFile.getInputStream(zipEntry);

    byte[] buffer = new byte[4096];

    int readLen = 0;

    while ((readLen = is.read(buffer, 0, 4096)) >= 0) {

    os.write(buffer, 0, readLen);

    }

    os.flush();

    os.close();

    } else {

    // 空目录

    FileUtil.buildFile(directoryPath + File.separator

    + zipEntry.getName(), true);

    }

    }

    }

    } catch (IOException ex) {

    throw ex;

    } finally {

    if(null != zipFile){

    zipFile = null;

    }

    if (null != is) {

    is.close();

    }

    if (null != os) {

    os.close();

    }

    }

    }

    public static File buildFile(String fileName, boolean isDirectory) {

    File target = new File(fileName);

    if (isDirectory) {

    target.mkdirs();

    } else {

    if (!target.getParentFile().exists()) {

    target.getParentFile().mkdirs();

    target = new File(target.getAbsolutePath());

    }

    }

    return target;

    }

    }

    调用方法

    public static void main (String [] args) throws FileNotFoundException, IOException{

    Long l = System.nanoTime();

    ZipUtil zu = new ZipUtil();

    ZipUtil.zip("E:\\1.zip", "", "F:\\外观\\");

    System.out.println(System.nanoTime() + " = " + (System.nanoTime()-l));

    }

    展开全文
  • java压缩zip文件解决中文乱码问题

    热门讨论 2010-11-02 15:45:04
    java压缩文件成zip实现无乱码 内置类与jar包
  • java 操作Zip文件(压缩、解压、加密) zip4j-1.3.2.jar ant-1.10.6.jar
  • Java压缩zip实例

    2012-09-12 16:53:54
    CheckedOutputStream……Java压缩文件类
  • java 实现压缩zip的几种方案

    千次阅读 2020-07-03 17:32:13
    需求,将指定目录下的文件及文件夹压缩成一个指定赔案号为名称,以".zip"结尾的压缩包提供客户下载。 package com.gblfy.util; import java.io.BufferedInputStream; import java.io.File; import java.io....

    需求,将指定目录下的文件及文件夹压缩成一个指定赔案号为名称,以".zip"结尾的压缩包提供客户下载。

    package com.gblfy.util;
    
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.zip.CRC32;
    import java.util.zip.CheckedOutputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    /**
     * java实现zip压缩文件(同一文件夹下的多个文件夹打成一个zip包)
     *
     * @author gblfy
     * @date 2020-07-02
     */
    public class ZipCompressorUtil {
        static final int BUFFER = 8192;
    
        private File zipFile;
    
        public ZipCompressorUtil(String pathName) {
            zipFile = new File(pathName);
        }
    
        /**
         * 压缩指定文件或者文件夹
         * <p>
         * 压缩文件夹,压缩包中包含自己本身这一级文件夹
         * 例如:
         *   压缩后的zip包名: a.zip
         *   压缩目录: D:\1\
         *   压缩完成后:a.zip 包中包含1这一级文件夹
         * </p>
         *
         * @param pathName 传入一个或者多个文件/文件夹的绝对路径 可变参数
         */
        public void compressContainShell(String... pathName) {
            ZipOutputStream out = null;
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
                CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,
                        new CRC32());
                out = new ZipOutputStream(cos);
                String basedir = "";
                for (int i = 0; i < pathName.length; i++) {
                    //循环遍历传入的文件或者文件夹的绝对路径的 可变参数
                    compress(new File(pathName[i]), out, basedir);
                }
                out.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 压缩指定文件或者文件夹
         *
         * @param files
         */
        public void compressContainShell(File[] files) {
            ZipOutputStream out = null;
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
                CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,
                        new CRC32());
                out = new ZipOutputStream(cos);
                String basedir = "";
                for (int i = 0; i < files.length; i++) {
                    //循环遍历传入的文件或者文件夹的绝对路径的 可变参数
                    compress(files[i], out, basedir);
                }
                out.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * /**
         * 压缩指定文件或者文件夹
         * <p>
         *   压缩文件夹,压缩包中包含自己本身这一级文件夹
         *   例如:
         *    压缩后的zip包名: a.zip
         *    压缩目录: D:\1\
         *    压缩完成后:a.zip 包中不包含1这一级文件夹
         * </p>
         *
         * @param srcPathNameOrFileName
         */
        public void compressNotContainShell(String srcPathNameOrFileName) {
            ZipOutputStream out = null;
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
                CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,
                        new CRC32());
                out = new ZipOutputStream(cos);
                String basedir = "";
                //循环遍历传入的文件或者文件夹的绝对路径的 可变参数
                File dir = new File(srcPathNameOrFileName);
                if (!dir.exists()) {
                    System.out.println("压缩目录不存在,请核实!");
                    return;
                }
                File[] files = dir.listFiles();
                for (int i = 0; i < files.length; i++) {
                    compress(new File(String.valueOf(files[i])), out, basedir);
                }
                out.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 判断传参类型:是目录还是文件
         * <p>
         *   1.如果是文件,则调用压缩文件方法
         *   2.如果是目录,则调用压缩目录方法
         * </p>
         *
         * @param file
         * @param out
         * @param basedir
         */
        private void compress(File file, ZipOutputStream out, String basedir) {
            if (file.isDirectory()) {
                System.out.println("压缩:" + basedir + file.getName());
                //调用压缩目录方法
                this.compressDirectory(file, out, basedir);
            } else {
                System.out.println("压缩:" + basedir + file.getName());
                //调用压缩文件方法
                this.compressFile(file, out, basedir);
            }
        }
    
        /**
         * 压缩一个目录
         *
         * @param dir  目录
         * @param out  zip输出流
         * @param basedir  基础路径前缀  例如: 第一层 “” 第二层 /
         */
        private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
            if (!dir.exists()) {
                System.out.println("压缩目录不存在,请核实!");
                return;
            }
            File[] files = dir.listFiles();
            for (int i = 0; i < files.length; i++) {
                /* 递归 */
                compress(files[i], out, basedir + dir.getName() + "/");
            }
        }
    
        /**
         *压缩一个文件
         *
         * @param file  文件
         * @param out  zip输出流
         * @param basedir 基础路径前缀  例如: 第一层 “” 第二层 /
         */
        private void compressFile(File file, ZipOutputStream out, String basedir) {
            if (!file.exists()) {
                System.out.println("压缩文件不存在,请核实!");
                return;
            }
            try {
                BufferedInputStream bis = new BufferedInputStream(
                        new FileInputStream(file));
                ZipEntry entry = new ZipEntry(basedir + file.getName());
                out.putNextEntry(entry);
                int count;
                byte data[] = new byte[BUFFER];
                while ((count = bis.read(data, 0, BUFFER)) != -1) {
                    out.write(data, 0, count);
                }
                bis.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 压缩指定文件或者文件夹
         * <p>
         *     压缩文件夹,压缩包中包含自己本身这一级文件夹
         * 例如:
         *    压缩后的zip包名: a.zip
         *    压缩目录: D:\1\
         *    压缩完成后:a.zip 包中包含1这一级文件夹
         * </p>
         *
         * @param srcPathNameOrFileName
         */
        public void compressContainShell(String srcPathNameOrFileName) {
            File file = new File(srcPathNameOrFileName);
            if (!file.exists()) {
                throw new RuntimeException(srcPathNameOrFileName + "不存在!");
            }
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
                CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,
                        new CRC32());
                ZipOutputStream out = new ZipOutputStream(cos);
                String basedir = "";
                compress(file, out, basedir);
                out.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        //--------------------------------------------单元测试--------------------------------------------
        public static void main(String[] args) {
            ZipCompressorUtil zc = new ZipCompressorUtil("D:/resource.zip");
            String b = "D:\\1\\";
            // // String b = "D:\\1.jpg";
            zc.compressNotContainShell(b);
            // zc.compress("D:\\1.jpg", "D:\\3.jpeg", "D:\\4.jpg", b);
        }
    }
    

    企业内部线上:补充方案

    package com.gblfy.test;
    
    
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.zip.CRC32;
    import java.util.zip.CheckedOutputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    /**
     * java实现zip压缩文件(同一文件夹下的多个文件夹打成一个zip包)
     *
     * @author gblfy
     * @date 2020-07-02
     */
    public class ZipCompressorUtil2 {
        static final int BUFFER = 8192;
    
        /**
         * 判断传参类型:是目录还是文件
         * <p>
         * 1.如果是文件,则调用压缩文件方法
         * 2.如果是目录,则调用压缩目录方法
         * </p>
         *
         * @param file
         * @param out
         * @param basedir
         */
        private void compress(File file, ZipOutputStream out, String basedir) {
            if (file.isDirectory()) {
                System.out.println("压缩:" + basedir + file.getName());
                //调用压缩目录方法
                this.compressDirectory(file, out, basedir);
            } else {
                System.out.println("压缩:" + basedir + file.getName());
                //调用压缩文件方法
                this.compressFile(file, out, basedir);
            }
        }
    
        /**
         * 压缩一个目录
         *
         * @param dir     目录
         * @param out     zip输出流
         * @param basedir 基础路径前缀  例如: 第一层 “” 第二层 /
         */
        private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
            if (!dir.exists()) {
                System.out.println("压缩目录不存在,请核实!");
                return;
            }
            File[] files = dir.listFiles();
            for (int i = 0; i < files.length; i++) {
                /* 递归 */
                compress(files[i], out, basedir + dir.getName() + "/");
            }
        }
    
        /**
         * 压缩一个文件
         *
         * @param file    文件
         * @param out     zip输出流
         * @param basedir 基础路径前缀  例如: 第一层 “” 第二层 /
         */
        private void compressFile(File file, ZipOutputStream out, String basedir) {
            if (!file.exists()) {
                System.out.println("压缩文件不存在,请核实!");
                return;
            }
            try {
                BufferedInputStream bis = new BufferedInputStream(
                        new FileInputStream(file));
                ZipEntry entry = new ZipEntry(basedir + file.getName());
                out.putNextEntry(entry);
                int count;
                byte data[] = new byte[BUFFER];
                while ((count = bis.read(data, 0, BUFFER)) != -1) {
                    out.write(data, 0, count);
                }
                bis.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * /**
         * 压缩指定文件或者文件夹
         * <p>
         * 压缩文件夹,压缩包中包含自己本身这一级文件夹
         * 例如:
         * 压缩后的zip包名: a.zip
         * 压缩目录: D:\1\
         * 压缩完成后:a.zip 包中不包含1这一级文件夹
         * </p>
         *
         * @param srcPathNameOrFileName
         */
        public void compressNotContainShell(String srcPathNameOrFileName, String zipFilePath) {
            ZipOutputStream out = null;
            try {
                File zipFile = getZipName(zipFilePath);
                FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
                CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,
                        new CRC32());
                out = new ZipOutputStream(cos);
                String basedir = "";
                //循环遍历传入的文件或者文件夹的绝对路径的 可变参数
                File dir = new File(srcPathNameOrFileName);
                if (!dir.exists()) {
                    System.out.println("压缩目录不存在,请核实!");
                    return;
                }
                File[] files = dir.listFiles();
                for (int i = 0; i < files.length; i++) {
                    compress(new File(String.valueOf(files[i])), out, basedir);
                }
                out.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 以
         * @param pathName
         * @return
         */
        public File getZipName(String pathName) {
            return new File(pathName);
        }
    
        //--------------------------------------------单元测试--------------------------------------------
        public static void main(String[] args) {
            ZipCompressorUtil2 zc = new ZipCompressorUtil2();
            String docPath = "D:\\22\\srcImgPath\\理赔报名类单证\\";
            String zipFileName = "D:\\22\\srcImgPath\\123.zip";
            zc.compressNotContainShell(docPath, zipFileName);
    
    
    
    
    
            // zc.compress("D:\\1.jpg", "D:\\3.jpeg", "D:\\4.jpg", b);
        }
    }
    
    
    展开全文
  • JAVA实现zip压缩/解压缩

    千次阅读 2021-08-21 20:15:21
    JAVA实现了I/O数据流与网络数据流的单一接口,因此数据的压缩、网络传输和解压缩的实现比较容易,下面介绍利用ZipEntry、ZipInputStream和ZipOutputStream三个Java类实现zip数据压缩方式的编程方法。 zip压缩文件结构...
  • java实现zip压缩

    2018-08-31 10:59:41
    java实现zip压缩、解压缩
  • java 压缩zip文件工具类

    千次阅读 2019-02-15 16:27:43
    文件压缩成一个zip包 代码: import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import java.util.zip.ZipEntry; import...
  • Java压缩文件和文件夹为zip格式

    千次阅读 2021-03-03 17:26:25
    工具类ZipUtils 如下: package utils; import java.io.File; import java.io.FileInputStream; import java.io.IOException;...import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream;
  • java实现zip压缩中文文件名乱码的解决办法:一、文件压缩的中文乱码问题1、中文文件名的乱码解决对于压缩的文件,当文件名称是中文时,若使用JDK API中自带的类(java.util.zip.ZipEntry; java.util.zip....
  • java 把文件压缩zip文件

    千次阅读 2022-02-23 21:59:14
    ackage org.fh.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;... * 说明:java压缩zip * 作者:FH Admin * from:fhadmin.cn */ public class FileZi.
  • 主要介绍了Java实现的zip压缩及解压缩工具类,结合实例形式分析了java对文件的进行zip压缩及解压缩的具体操作技巧,需要的朋友可以参考下
  • 主要介绍了使用java API实现zip递归压缩文件夹及解压,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • NULL 博文链接:https://zhenyong.iteye.com/blog/1576148
  • 在测试过程中看到后台打印的日志出现异常,发现这也是历史... at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:215) 出现这种错误的原因是:打包的过程中,出现相同的文件名称 关键代码 pub...
  • Java操作zip压缩格式的开源项目,功能强大而且使用方便,能完全满足Java操作Zip压缩文件,官方网址为:http://www.lingala.net/zip4j/ 可以下载到jar包、源码和示例,好像没有提供API文档。 不过需要使用代理访问...
  • Java调用Zip类批量压缩多个文件,此前有一个是压缩单个文件,也可参考,相关代码中可找到此源码。  public class ZipDemo extends JFrame{  JFileChooser fileChooser; //文件选择器  JList fileList; //待...
  • 主要为大家详细介绍了java动态导出excel压缩zip下载的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Java Zip文件解压缩

    2020-12-22 16:44:28
    为了解压缩zip都折腾两天了,查看了许多谷歌、百度来的code,  真实无语了,绝大多数是不能用的。这可能跟我的开发环境有关吧。  我用的是Ubuntu14.04,eclipse 用的是STS3.5,jdk81.8.0_20  经过两天的努力...
  • java压缩zip文件中文乱码问题

    千次阅读 2019-05-24 15:06:53
    java来打包文件生成压缩文件,有两个地方会出现乱码 1、内容的中文乱码问题,这个问题网上很多人给出了解决方法,两种:修改sun的源码;使用开源的类库org.apache.tools.zip.ZipOutputStream和org.apache.tools....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 105,984
精华内容 42,393
关键字:

java压缩zip

友情链接: HXEDDJE.zip