六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 62|回复: 0

Java解压缩Zip文件(支持中文)

[复制链接]

升级  30%

3

主题

3

主题

3

主题

童生

Rank: 1

积分
15
 楼主| 发表于 2013-1-15 02:56:11 | 显示全部楼层 |阅读模式
      最近有个项目需要用Java做解压缩Zip文件,由于JDK自带的zip相关的类都不支持以中文命名的文件,所以在网上搜索了些资料,自己花了点时间研究了下。希望和大家分享下,有不足的地方还多多指教。
 
      废话不多说,直接看代码吧!(记住:在classpath里面一定要引入ant.jar这个jar包。)
 
package org.zapldy.io;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.util.Enumeration;import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipFile;import org.apache.tools.zip.ZipOutputStream;public abstract class ZipUtils { public static void zip(String source, String dest) throws IOException {  OutputStream os = new FileOutputStream(dest);  BufferedOutputStream bos = new BufferedOutputStream(os);  ZipOutputStream zos = new ZipOutputStream(bos);        //支持中文,但有缺陷!这是硬编码!  zos.setEncoding("GBK");      File file = new File(source);  String basePath = null;  if (file.isDirectory()) {   basePath = file.getPath();  } else {   basePath = file.getParent();  }  zipFile(file, basePath, zos);  zos.closeEntry();  zos.close(); } public static void unzip(String zipFile, String dest) throws IOException {  ZipFile zip = new ZipFile(zipFile);  Enumeration<ZipEntry> en = zip.getEntries();  ZipEntry entry = null;  byte[] buffer = new byte[1024];  int length = -1;  InputStream input = null;  BufferedOutputStream bos = null;  File file = null;  while (en.hasMoreElements()) {   entry = (ZipEntry) en.nextElement();   if (entry.isDirectory()) {    file = new File(dest, entry.getName());    if (!file.exists()) {     file.mkdir();    }    continue;   }   input = zip.getInputStream(entry);   file = new File(dest, entry.getName());   if (!file.getParentFile().exists()) {    file.getParentFile().mkdirs();   }   bos = new BufferedOutputStream(new FileOutputStream(file));   while (true) {    length = input.read(buffer);    if (length == -1)     break;    bos.write(buffer, 0, length);   }   bos.close();   input.close();  }  zip.close(); } private static void zipFile(File source, String basePath, ZipOutputStream zos) throws IOException {  File[] files = new File[0];  if (source.isDirectory()) {   files = source.listFiles();  } else {   files = new File[1];   files[0] = source;  }  String pathName;  byte[] buf = new byte[1024];  int length = 0;  for (File file : files) {   if (file.isDirectory()) {    pathName = file.getPath().substring(basePath.length() + 1) + "/";    zos.putNextEntry(new ZipEntry(pathName));    zipFile(file, basePath, zos);   } else {    pathName = file.getPath().substring(basePath.length() + 1);    InputStream is = new FileInputStream(file);    BufferedInputStream bis = new BufferedInputStream(is);    zos.putNextEntry(new ZipEntry(pathName));    while ((length = bis.read(buf)) > 0) {     zos.write(buf, 0, length);    }    is.close();   }  } }} 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表