解压缩zip文件(解决中文乱码)

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Enumeration;

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

/**

*使用ant下的包
* zip的解压缩工具类
*/
public class ZipUtils {
static final int BUFFER = 1024;
/**
* 用zip格式压缩文件
* @param zipFileName 压缩后的文件名 包含路径 如:"c:\\test.zip"
* @param inputFile 要压缩的文件 可以是文件或文件夹 如:"c:\\test" 或 "c:\\test.doc"
* @throws Exception

*ant下的zip工具默认压缩编码为UTF-8编码,而winRAR软件压缩是用的windows默认的GBK或者GB2312编码

*用ant压缩后放到windows上面会出现中文文件名乱码,用winRAR压缩的文件,用ant解压也会出现乱码,

*所以,在用ant处理winRAR压缩的文件时,要设置压缩编码
*/
public static void zip( File zipFile, String inputFile)
    throws Exception {
   File f = new File(inputFile);
   //File temp = new File(zipFileName);
   ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
     zipFile));

//设置压缩编码

   out.setEncoding("GBK");//设置为GBK后在windows下就不会乱码了,如果要放到Linux或者Unix下就不要设置了
   zip(out, f, "");// 递归压缩方法
   System.out.println("zip done");
   out.close();
}

private static void zip(ZipOutputStream out, File f, String base)
    throws Exception {
   System.out.println("Zipping   " + f.getName()); // 记录日志,开始压缩
   if (f.isDirectory()) { // 如果是文件夹,则获取下面的所有文件
    File[] fl = f.listFiles();
    out.putNextEntry(new ZipEntry(base + "/"));// 此处要将文件写到文件夹中只用在文件名前加"/"再加文件夹名
    base = base.length() == 0 ? "" : base + "/";
    for (int i = 0; i < fl.length; i++) {
     zip(out, fl[i], base + fl[i].getName());
    }
   } else { // 如果是文件,则压缩
    out.putNextEntry(new ZipEntry(base)); // 生成下一个压缩节点
    FileInputStream in = new FileInputStream(f); // 读取文件内容
    int len;
    byte[] buf = new byte[BUFFER];
    while ((len = in.read(buf, 0, BUFFER)) != -1) {
     out.write(buf, 0, len); // 写入到压缩包
    }
    in.close();
   }
}


/**
* 解压缩zip文件 
* @param fileName 要解压的文件名 包含路径 如:"c:\\test.zip"
* @param filePath 解压后存放文件的路径 如:"c:\\temp"
* @throws Exception
*/
public static void unZip(String fileName, String filePath) throws Exception{
   ZipFile zipFile = new ZipFile(fileName,"GBK"); //以“GBK”编码创建zip文件,用来处理winRAR压缩的文件。
   Enumeration emu = zipFile.getEntries();
  
  
   while(emu.hasMoreElements()){
    ZipEntry entry = (ZipEntry) emu.nextElement();
    if (entry.isDirectory()){
     new File(filePath+entry.getName()).mkdirs();
     continue;
    }
    BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry));
   
    File file = new File(filePath + entry.getName());
    File parent = file.getParentFile();
    if(parent != null && (!parent.exists())){
     parent.mkdirs();
    }
    FileOutputStream fos = new FileOutputStream(file);
    BufferedOutputStream bos = new BufferedOutputStream(fos,BUFFER);

    byte [] buf = new byte[BUFFER];
    int len = 0;
    while((len=bis.read(buf,0,BUFFER))!=-1){
     fos.write(buf,0,len);
    }
    bos.flush();
    bos.close();
    bis.close();
    System.out.println("解压文件:"+file.getName());
   }
   zipFile.close();
}




}
 

文件压缩的中文问题

中文,一直是个头疼的问题,同样,在这里我们对文件压缩也会出现中文乱码问题。对压缩的文件,如果文件名称是中文,压缩完成后,可以看到压缩包中的文件名称是乱码(文件的内容有中文,压缩后不会出现中文乱码问题),对于这种情况我们只要用ANT中的ant.jar中的类就可以解决此问题。压缩过程中会用到ZipEntry和ZipOutputStream类,如果我采用第一种方式,这样就会出现中文乱码;如果我采用第二种方式,中文乱码问题就可以解决

第一种方式

import java.util.zip.ZipEntry;

import java.util.zip.ZipOutputStream;

以上采用JDK API中自带的类时压缩的文件名会出现中文乱码

第二种方式

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

以上采用ANT中ant.jar包的类可以解决压缩的文件名的中文乱码问题

 

下载jar包

对于本节我只需要一个jar包,即ant.jar,提供jar包的下载路径如下:

 http://files.cnblogs.com/java-pan/jar-ant.rar

method&class

ZipEntry:

ZipOutputStream:

 


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
解压缩zip文件中含有中文名的文件时,可能会出现乱码或者解压失败的问题。这是因为在压缩文件时,文件名使用了默认编码格式,而在解压缩时,解压软件使用了不同的编码格式,导致文件名解析错误。 为了解决这个问题,可以通过指定解压缩文件名的编码格式来解决。以下是一个Java程序示例,用于解压缩zip文件并处理中文文件名的编码问题: ```java import java.io.*; import java.util.*; import java.util.zip.*; public class ZipUtils { public static void unzip(File zipFile, File destDir, String charset) throws IOException { if (!destDir.exists()) { destDir.mkdirs(); } ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFile), Charset.forName(charset)); ZipEntry entry; byte[] buffer = new byte[1024]; while ((entry = zipIn.getNextEntry()) != null) { String fileName = entry.getName(); if (entry.isDirectory()) { File subDir = new File(destDir, fileName); subDir.mkdirs(); continue; } File file = new File(destDir, fileName); File parent = file.getParentFile(); if (!parent.exists()) { parent.mkdirs(); } OutputStream out = new FileOutputStream(file); int len; while ((len = zipIn.read(buffer)) > 0) { out.write(buffer, 0, len); } out.close(); } zipIn.close(); } } ``` 在调用此方法时,可以指定解压缩文件名的编码格式,例如: ```java ZipUtils.unzip(new File("sun.zip"), new File("destDir"), "GBK"); ``` 这里的编码格式使用了GBK,根据实际情况可以修改为其他编码格式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值