Java压缩一个文件夹的方法

Java压缩文件工具类实现
本文介绍了一个使用Java实现的压缩文件工具类,能够处理文件和文件夹的压缩,支持递归压缩文件夹内的所有文件,同时确保空文件夹不被包含在压缩包内。该工具类利用了Java的ZipOutputStream和BufferedInputStream等类来完成压缩操作。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
* @ClassName: CompressDirUtil 
* @Description: 压缩文件工具类
* @author zhoujie 
* @date 2018年7月29日 下午9:08:44 
* @version V1.0
 */
public class CompressDirUtil {
	static String compresspath = "F:\\图片\\转换图片"; //需要压缩的文件夹的目录
	
	public static void main(String[] args) {
		boolean bl = compressFileToZip(compresspath); //压缩文件
		if(bl){
			System.out.println("压缩成功");
		}
    }
	
	/**
	* @Title: compressAllFileZip 
	* @Description: 传递文件路径压缩文件,传递文件夹路径压缩文件夹,注:空的文件夹不会出现在压缩包内
	* @param @param compresspath 需要压缩的文件夹的目录
	* @return void    返回类型 
	* @throws
	 */
	public static boolean compressFileToZip(String compresspath) {
		boolean bool = false;
		try {
			ZipOutputStream zipOutput = null;
        	File file = new File(compresspath);
        	if(file.isDirectory()){
        		zipOutput = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(compresspath + ".zip")));
        		compressZip(zipOutput, file, ""); //递归压缩文件夹,最后一个参数传""压缩包就不会有当前文件夹;传file.getName(),则有当前文件夹;
        	}else{
        		zipOutput = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(compresspath.substring(0, compresspath.lastIndexOf(".")) + ".zip")));
        		zipOFile(zipOutput, file); //压缩单个文件
        	}
            zipOutput.closeEntry();
			zipOutput.close();
			bool = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bool;
	}

    /**
    * @Title: compressZip 
    * @Description: 子文件夹中可能还有文件夹,进行递归
    * @param @param zipOutput
    * @param @param file
    * @param @param suffixpath
    * @param @throws IOException    
    * @return void    返回类型 
    * @throws
     */
    private static void compressZip(ZipOutputStream zipOutput, File file, String suffixpath) {
    	File[] listFiles = file.listFiles();// 列出所有的文件
        for(File fi : listFiles){
            if(fi.isDirectory()){
            	if(suffixpath.equals("")){
            		compressZip(zipOutput, fi, fi.getName());
            	}else{
            		compressZip(zipOutput, fi, suffixpath + File.separator + fi.getName());
            	}
            }else{
                zip(zipOutput, fi, suffixpath);
            }
        }
    }

    /**
    * @Title: zip 
    * @Description: 压缩的具体操作
    * @param @param zipOutput 
    * @param @param file  文件
    * @param @param suffixpath  文件夹拼接路径
    * @return void    返回类型 
    * @throws
     */
    public static void zip(ZipOutputStream zipOutput, File file, String suffixpath) {
        try {
        	ZipEntry zEntry = null;
        	if(suffixpath.equals("")){
        		zEntry = new ZipEntry(file.getName());
        	}else{
        		zEntry = new ZipEntry(suffixpath + File.separator + file.getName());
        	}
			zipOutput.putNextEntry(zEntry);
			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
	        byte[] buffer = new byte[1024];
	        int read = 0;
	        while((read = bis.read(buffer)) != -1){
	            zipOutput.write(buffer, 0, read);
	        }
	        bis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
    /**
     * @Title: zip 
     * @Description: 压缩单个文件
     * @param @param zipOutput 
     * @param @param file  文件
     * @return void    返回类型 
     * @throws
      */
     public static void zipOFile(ZipOutputStream zipOutput, File file) {
         try {
         	ZipEntry zEntry = new ZipEntry(file.getName());
 			zipOutput.putNextEntry(zEntry);
 			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
 	        byte[] buffer = new byte[1024];
 	        int read = 0;
 	        while((read = bis.read(buffer)) != -1){
 	            zipOutput.write(buffer, 0, read);
 	        }
 	        bis.close();
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
     }
	
}

 

Java 实现文件夹压缩,可以使用 `java.util.zip` 包中的类来完成。以下是一个简单的示例代码,该代码实现了将指定文件夹压缩成 ZIP 文件的功能: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class FolderZipper { public static void zipFolder(String sourceFolderPath, String zipFilePath) throws IOException { FileOutputStream fos = new FileOutputStream(zipFilePath); ZipOutputStream zipOut = new ZipOutputStream(fos); File sourceFolder = new File(sourceFolderPath); zipFile(sourceFolder, sourceFolder.getName(), zipOut); zipOut.close(); fos.close(); } private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException { if (fileToZip.isHidden()) { return; } if (fileToZip.isDirectory()) { if (fileName.endsWith("/")) { zipOut.putNextEntry(new ZipEntry(fileName)); zipOut.closeEntry(); } else { zipOut.putNextEntry(new ZipEntry(fileName + "/")); zipOut.closeEntry(); } File[] children = fileToZip.listFiles(); for (File childFile : children) { zipFile(childFile, fileName + "/" + childFile.getName(), zipOut); } return; } FileInputStream fis = new FileInputStream(fileToZip); ZipEntry zipEntry = new ZipEntry(fileName); zipOut.putNextEntry(zipEntry); byte[] bytes = new byte[1024]; int length; while ((length = fis.read(bytes)) >= 0) { zipOut.write(bytes, 0, length); } fis.close(); } public static void main(String[] args) { try { zipFolder("path/to/source/folder", "path/to/output.zip"); System.out.println("Folder zipped successfully!"); } catch (IOException e) { e.printStackTrace(); } } } ``` 在上述代码中,`zipFolder` 方法接收源文件夹路径和目标 ZIP 文件路径作为参数,通过递归调用 `zipFile` 方法文件夹及其子文件和子文件夹添加到 ZIP 压缩包中。 另外,引用 [1] 中也提供了一个实现文件及文件夹压缩方法示例: ```java /** * inputFileName 输入一个文件夹名称 * zipFileName 输出一个压缩文件夹 */ public void zip(String zipFileName, String inputFileName) throws Exception { String zipFileName = "c://test.zip"; // 打包后文件名字 System.out.println(zipFileName); zip(zipFileName, new File(inputFileName)); } ``` 不过该示例代码存在一些问题,比如重复定义了 `zipFileName` 变量,需要修正后才能正常使用。 同时,若要处理 RAR 压缩,引用 [2] 中提到可以引入 `org.apache.commons:commons-compress:1.9` 依赖: ```xml <!--rar压缩--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.9</version> </dependency> ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值