解决中文压缩与解压问题
使用的是org.apache.tools.zip包下面的相关类
下面是自己写的类,可以设置和获取Zip文件的注释信息
Java代码
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.Enumeration;
- import java.util.List;
- import org.apache.tools.zip.ZipEntry;
- import org.apache.tools.zip.ZipFile;
- import org.apache.tools.zip.ZipOutputStream;
- public class ZipUtil {
- private String comment = "";
- public void setComment(String comment) {
- this.comment = comment;
- }
- public void zip(String src, String dest, List filter) throws Exception {
- ZipOutputStream out = new ZipOutputStream(new FileOutputStream(dest));
- File srcFile = new File(src);
- zip(out,srcFile,"",filter);
- out.close();
- }
- public void zip(ZipOutputStream out, File srcFile, String base, List filter) throws Exception {
- if(srcFile.exists()==false) {
- throw new Exception("压缩目录不存在!");
- }
- if(srcFile.isDirectory()) {
- File[] files = srcFile.listFiles();
- base = base.length() == 0 ? "" : base + "/";
- if (isExist(base, filter)) {
- out.putNextEntry(new ZipEntry(base));
- }
- for(int i=0; i<files.length; i++) {
- zip(out,files[i],base + files[i].getName(),filter);
- }
- } else {
- if (isExist(base, filter)) {
- base = base.length() == 0 ? srcFile.getName() : base ;
- ZipEntry zipEntry = new ZipEntry(base);
- zipEntry.setComment(comment);
- out.putNextEntry(zipEntry);
- FileInputStream in = new FileInputStream(srcFile);
- int length = 0;
- byte[] b = new byte[1024];
- while((length=in.read(b,0,1024))!=-1) {
- out.write(b,0,length);
- }
- in.close();
- }
- }
- }
- public boolean isExist(String base, List list) {
- if (list != null && !list.isEmpty()) {
- for (int i = 0; i < list.size(); i++) {
- if (base.indexOf((String) list.get(i)) >= 0) {
- return true;
- }
- }
- }
- return false;
- }
- public void unZip(String srcFile,String dest,boolean deleteFile) throws Exception {
- File file = new File(srcFile);
- if(!file.exists()) {
- throw new Exception("解压文件不存在!");
- }
- ZipFile zipFile = new ZipFile(file,"GB2312");
- Enumeration e = zipFile.getEntries();
- while(e.hasMoreElements()) {
- ZipEntry zipEntry = (ZipEntry)e.nextElement();
- if(zipEntry.isDirectory()) {
- String name = zipEntry.getName();
- name = name.substring(0,name.length()-1);
- File f = new File(dest + name);
- f.mkdirs();
- } else {
- File f = new File(dest + zipEntry.getName());
- f.getParentFile().mkdirs();
- f.createNewFile();
- InputStream is = zipFile.getInputStream(zipEntry);
- FileOutputStream fos = new FileOutputStream(f);
- int length = 0;
- byte[] b = new byte[1024];
- while((length=is.read(b, 0, 1024))!=-1) {
- fos.write(b, 0, length);
- }
- is.close();
- fos.close();
- }
- }
- if (zipFile != null) {
- zipFile.close();
- }
- if(deleteFile) {
- file.deleteOnExit();
- }
- }
- public static String getZipComment(String srcFile) {
- String comment = "";
- try {
- ZipFile zipFile = new ZipFile(srcFile);
- Enumeration e = zipFile.getEntries();
- while (e.hasMoreElements()) {
- ZipEntry ze = (ZipEntry) e.nextElement();
- comment = ze.getComment();
- if (comment != null && !comment.equals("")
- && !comment.equals("null")) {
- break;
- }
- }
- zipFile.close();
- } catch (Exception e) {
- System.out.println("获取zip文件注释信息失败:" + e.getMessage());
- }
- return comment;
- }
- public static void main(String[] args) throws Exception {
- long begin = System.currentTimeMillis();
- ZipUtil zu = new ZipUtil();
- List<String> filter = new ArrayList<String>();
- filter.add("3RDPARTY");
- filter.add("BANNER.GIF");
- zu.setComment("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
- zu.zip("C:/VALUEADD", "c:/hh.zip",filter);
- System.out.println(ZipUtil.getZipComment("c:/hh.zip"));
- //new ZipUtil().unZip("c:/tt.zip", "c:/mmmmmmmmmmmmmmmmmmm/", true);
- //File f = new File("c:/hh.zip");
- //f.deleteOnExit();
- long end = System.currentTimeMillis();
- System.out.println(end-begin);
- }
- }
- 如果不需要上面的filter,可以添加fileter为空list或者用下面的程序:
- 不带filter的zip压缩:
- //
- // * @author WeiMiao
- // * @param out: ZipOutputStream
- // * @param srcFile: 要压缩的目录
- // * @param base: 根路径
- // * @throws Exception
- //
- public static void zip(ZipOutputStream out, File srcFile, String base) throws Exception {
- if (!srcFile.exists()) {
- throw new Exception("压缩目录不存在!");
- }
- if (srcFile.isDirectory()) {
- File[] files = srcFile.listFiles();
- base = base.length() == 0 ? "" : base + "/";
- if (base.length() > 0) {
- out.putNextEntry(new ZipEntry(base));
- }
- for (int i = 0; i < files.length; i++) {
- zip(out, files[i], base + files[i].getName());
- }
- } else {
- base = base.length() == 0 ? srcFile.getName() : base;
- out.putNextEntry(new ZipEntry(base));
- FileInputStream fis = new FileInputStream(srcFile);
- int length = 0;
- byte[] b = new byte[BUFFER];
- while ((length = fis.read(b, 0, BUFFER)) != -1) {
- out.write(b, 0, length);
- }
- fis.close();
- }
- }