Java 压缩ZIP文件

使用Apache工具解决中文文件名乱码的文件压缩方法

1.需要导入的两个架包

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

用apache的相关类代替Java的相关类,可以解决压缩文件中中文文件名乱码的问题。

2.代码如下

/**
	 * 压缩文件
	 * @param zipFile 压缩后的压缩包文件
	 * @param files 要压缩的文件数组
	 */
	public static void zip(File zipFile,File[] files){
		if(files==null || files.length==0){
			return;
		}
		byte[] buffer=new byte[2048];
		FileInputStream fis=null;
		ZipOutputStream zos=null;
		try{
			zos=new ZipOutputStream(new FileOutputStream(zipFile));
			for(File file : files){
				fis=new FileInputStream(file);
				zos.putNextEntry(new ZipEntry(file.getName()));
				zos.setEncoding("GBK");
				int len;
				while((len=fis.read(buffer))>0){
					zos.write(buffer,0,len);
				}
				zos.closeEntry();
				fis.close();
			}
			zos.close();
		}
		catch(Exception e){
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
	}

3.测试代码如下

File f=new File("D:\\tmp\\212033");
		File zipFile=new File("D:\\tmp\\212033.zip");
		Test11.zip(zipFile,f.listFiles());

该压缩方法不支持通过f.listFiles()传入文件数组时,文件夹中包含文件夹的情况。

### Java 创建 ZIP 文件Java 中,可以利用 `java.util.zip` 包来实现文件压缩功能。以下是基于提供的参考资料[^1]以及标准库的功能描述,展示如何通过代码创建一个简单的 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 ZipUtil { /** * 将指定路径下的文件文件夹打包为ZIP文件。 * * @param srcFilePath 要被压缩的目标文件/文件夹路径 * @param zipFilePath 输出的ZIP文件路径 */ public static void compress(String srcFilePath, String zipFilePath) { File sourceFile = new File(srcFilePath); try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFilePath))) { if (sourceFile.isDirectory()) { addFolderToZip("", sourceFile, zos); // 如果是文件夹,则递归添加 } else { addFileToZip(sourceFile.getName(), sourceFile, zos); // 单个文件直接加入 } } catch (IOException e) { System.err.println("压缩失败:" + e.getMessage()); } } private static void addFileToZip(String path, File fileToAdd, ZipOutputStream zos) throws IOException { FileInputStream fis = null; try { fis = new FileInputStream(fileToAdd); ZipEntry ze = new ZipEntry(path + "/" + fileToAdd.getName()); // 设置ZIP条目名称 zos.putNextEntry(ze); byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) >= 0) { // 写入数据到ZIP流中 zos.write(buffer, 0, length); } zos.closeEntry(); } finally { if (fis != null) { fis.close(); // 关闭输入流 } } } private static void addFolderToZip(String basePath, File folder, ZipOutputStream zos) throws IOException { for (File file : Objects.requireNonNull(folder.listFiles())) { if (file.isDirectory()) { addFolderToZip(basePath + "/" + file.getName(), file, zos); // 对子文件夹继续递归 } else { addFileToZip(basePath, file, zos); // 添加单个文件 } } } } ``` 上述代码实现了对单一文件或者整个文件夹的内容进行压缩并保存至目标位置的功能。如果需要支持带密码保护或其他高级特性,则可能还需要借助第三方库如 Apache Commons Compress 或者 TrueZip 等扩展能力。 #### 使用示例 假设有一个名为 "example.txt" 的文本文件位于当前工作目录下,希望将其压缩为 example.zip: ```java public class Main { public static void main(String[] args) { String filePath = "./example.txt"; // 输入源文件地址 String outputZipPath = "./example.zip"; // 输出压缩后的ZIP文件ZipUtil.compress(filePath, outputZipPath); System.out.println("压缩完成!"); } } ``` 执行以上程序后,在同一目录应该能看到新生成的例子 ZIP 文件。 ### 总结 本文介绍了如何运用纯 JDK 提供的方式来进行基础级别的文件压缩处理,并提供了具体可运行实例帮助理解实际应用过程中的细节问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值