您的位置:首页 > 其它

zip压缩文件中文乱码的解决

2008-01-25 11:16 489 查看
使用java.util.zip下的类进行文件压缩,对中文文件名会产生乱码。本文中的方法解决了中文文件压缩的乱码问题。但是对于解压缩中文文件的乱码问题,还没有好的解决方法。在网上查的资料,只有修改java.util.zip下的zipInputStream.java文件解决这个问题。相关资料可以参考这篇文章http://www.lyore.cn/blog/read-136.html


package com.oryx.file;




import java.io.BufferedInputStream;


import java.io.BufferedOutputStream;


import java.io.BufferedReader;


import java.io.File;


import java.io.FileInputStream;


import java.io.FileNotFoundException;


import java.io.FileOutputStream;


import java.io.IOException;


import java.io.InputStreamReader;


import java.util.zip.CRC32;


import java.util.zip.CheckedOutputStream;


import java.util.zip.ZipEntry;


import java.util.zip.ZipInputStream;




import org.apache.tools.zip.ZipOutputStream;






public class ZipUtil ...{




private static int BUFFER = 2048;


private static String ENCODING = "GBK";




/** *//**


* 压缩文件


* @param src 源文件/目录


* @param dest 压缩后的文件/目录


*/




public static void zip(String src, String dest) ...{


System.out.println("生成压缩文件……");


File srcFile = new File(src);


File destFile = new File(dest);




if(destFile.isDirectory())...{


//构造压缩文件名。取当前文件/目录名称为压缩文件名。


String name = srcFile.getName();


System.out.println(name);


name = name.indexOf(".")>0?name.substring(0,name.indexOf(".")):name;


name = name+".zip";


destFile = new File(destFile+"/"+name);


}


System.out.println(destFile.getAbsolutePath());


zip(srcFile, destFile);


}






/** *//**


* 压缩文件


* @param src


* @param dest


*/




public static void zip(File src, File dest) ...{




try ...{


FileOutputStream fout = new FileOutputStream(dest);


CheckedOutputStream chc = new CheckedOutputStream(fout, new CRC32());


ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(chc));


System.out.println("开始递归压缩……");


zip(out,src,src.getName());


out.close();




} catch (FileNotFoundException e) ...{


e.printStackTrace();




} catch (IOException e) ...{


// TODO Auto-generated catch block


e.printStackTrace();


}


}






/** *//**


* 递归压缩文件夹


* @param out 输出流


* @param srcFile 压缩文件名


* @param path 压缩文件路径


*/




public static void zip(ZipOutputStream out, File srcFile, String path) ...{






try ...{




if (srcFile.isDirectory()) ...{


System.out.println("压缩文件夹"+srcFile.getName());


File[] f = srcFile.listFiles();


out.putNextEntry(new org.apache.tools.zip.ZipEntry(path + "/"));


path = path.equals("") ? "" : path + "/";






for (int i = 0; i < f.length; i++) ...{


zip(out, f[i], path + f[i].getName());


}




} else ...{


System.out.println("压缩文件"+path);


out.putNextEntry(new org.apache.tools.zip.ZipEntry(path));


BufferedReader in = new BufferedReader(new InputStreamReader(


new FileInputStream(srcFile), "iso8859-1"));




int c;




while (-1 != (c = in.read())) ...{


out.write(c);


}


in.close();


}






} catch (IOException e) ...{


// TODO Auto-generated catch block


e.printStackTrace();


}




}










/** *//**


* 定义解压缩zip文件的方法。


* 未解决中文文件名问题


* @param zipFileName


* @param outputDirectory


*/




public static void unZip(String zipFileName, String outputDirectory) ...{




try ...{


ZipInputStream in = new ZipInputStream(new BufferedInputStream(


new FileInputStream(zipFileName)));


BufferedOutputStream bos = null;


//获取ZipInputStream中的ZipEntry条目,一个zip文件中可能包含多个ZipEntry,


//当getNextEntry方法的返回值为null,则代表ZipInputStream中没有下一个ZipEntry,


//输入流读取完成;


ZipEntry entry;




while ((entry = in.getNextEntry()) != null) ...{


System.out.println("unziping " + entry.getName());




//创建以zip包文件名为目录名的根目录


File f = new File(outputDirectory);


f.mkdir();




if (entry.isDirectory()) ...{


String name = entry.getName();


name = name.substring(0, name.length() - 1);


System.out.println("name " + name);


f = new File(outputDirectory + File.separator + name);


f.mkdir();


System.out.println("mkdir " + outputDirectory


+ File.separator + name);




} else ...{


f = new File(outputDirectory + File.separator


+ entry.getName());


f.createNewFile();


FileOutputStream out = new FileOutputStream(f);


bos = new BufferedOutputStream(out, BUFFER);


int b;


byte data[] = new byte[BUFFER];




while ((b = in.read(data, 0, BUFFER)) != -1) ...{


bos.write(data, 0, b);


}


bos.close();


}


}


in.close();




} catch (Exception e) ...{


e.printStackTrace();


}


}






/** *//**


* 设置缓冲区大小


* @param size


*/




public static void setBuffer(int size) ...{


BUFFER = size;


}






/** *//**


* 设置字符编码


* @param size


*/




public static void setEncoding(String encoding) ...{


ENCODING = encoding;


}






public static void main(String[] args) throws IOException ...{




String path = "d:/temp/";


String path2 = "d:/temp/test.zip";


String path3 = "d:/temp/";




// ZipUtil.zip(path, path2);


System.out.println("压缩成功!");


ZipUtil.unZip(path2,path3);


System.out.println("解压成功!");


}




}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: