用过jdk自带的压缩或解压想必大家都知道不支持中文
之前介绍了利用java.util.zip这个package里的class来完成压缩及解压缩的工作,但是我们知道,java对於文字的编码是以unicode为基础,因此,若是以ZipInputStream及ZipOutputStream来处理压缩及解压缩的工作,碰到中文档名或路径,那当然是以unicode来处理罗!但是,现在市面上的压缩及解压缩软体,例如winzip,却是不支援unicode的,一碰到档名以unicode编码的档案,它就不处理。
那要如何才能做出让winzip能够处理的压缩档呢?那就得从修改ZipInputStream及ZipOutputStream对於档名的编码方式来着手了。我们可以从jdk的src.zip取得ZipInputStream及ZipOutputStream的原始码来加以修改:
这里我上传了我修改后的附件,大家可以下载下来放到项目中让jdk也zip也支持中文 http://download.youkuaiyun.com/detail/zou_hailin226/5304571
这里我直接代码搬出来给大家看
package zip;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import jdk.CNZipInputStream;
import jdk.CNZipOutputStream;
import jdk.ZipEntry;
public class ZipCaoZuo {
/*这里需要注意一下就是导入的包CNZipInputStream、CNZipOutputStream、ZipEntry 一定要用修改后的包*/
/**解压方法
* @param bytes 压缩后的文件字节流
* @return Map<文件名,文件字节流>
* @throws Exception
*/
public static Map<String, byte[]> jieYa(byte[] bytes)throws Exception{
Map<String, byte[]> map = new HashMap<String, byte[]>();
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
CNZipInputStream zip = new CNZipInputStream(bis,"GB2312");//GB2312是简体中文、如果要用繁体中文的可以用BIG5
ZipEntry entry = null;
while((entry = zip.getNextEntry())!= null){
String entryName = entry.getName();
ByteArrayOutputStream output = new ByteArrayOutputStream();
int i =0;
while((i=zip.read())!=-1){
output.write(i);
}
map.put(entryName, output.toByteArray());
output.flush();
output.close();
}
zip.closeEntry();
zip.close();
bis.close();
return map;
}
/**压缩方法
* @param map Map<文件名,文件字节流>
* @return byte[]
* @throws Exception
*/
public static byte[] yaSuo(Map<String, byte[]> map)throws Exception{
ByteArrayOutputStream fileOutput = new ByteArrayOutputStream();
CNZipOutputStream out = new CNZipOutputStream(fileOutput);
out.setMethod(CNZipOutputStream.DEFLATED);
Set<String> key = map.keySet();
for (Iterator it = key.iterator(); it.hasNext();) {
String fileName = (String) it.next();
byte[] file = map.get(fileName);
if(file == null){
continue;
}
out.putNextEntry(new ZipEntry(fileName));
out.write(file,0,file.length);
out.closeEntry();
}
out.flush();
out.close();
fileOutput.flush();
fileOutput.close();
return fileOutput.toByteArray();
}
}
顺便上传一个图片方便大家理解