zip格式压缩和解压缩(支持中文和文件嵌套解压缩)
我在公司项目过程需要用到zip文件的压缩与解压的功能,于是自己研究了一下,找了一些,自己写了一个压缩和解压缩的代码,支持中文,可以文件嵌套(注意其中所用的类是ant.jar中的包中的类,我用的是1.6.0版本)
/** */ /**
*用于对指定源文件路径下的所有文件压缩到指定的文件中
* @param des String 需要压缩成的文件名
* @param src String 压缩文件源路径,可以是文件或文件夹
* @return boolean 如果压缩成功返回true,否则表示失败
*/
public static boolean File2Zip(String des, String src) … {
boolean success =true; //压缩成功标志
File srcpath =new File(src);
ZipOutputStream out =null;
try…{
out =new ZipOutputStream(new FileOutputStream(new File(
des))); //创建压缩输出流
out.setEncoding(“gbk”);
compress(srcpath, out, “”); //开始压缩
}
catch (FileNotFoundException ex) …{
success =false;
}
catch (IOException ex1) …{
success =false;
}
finally…{
if (out !=null) …{
try…{
out.close();
}
catch (IOException ex2) …{
}
}
}
return success;
}
/** */ /**
*
* @param src File
* @param out ZipOutputStream
* @param base String
* @throws IOException
*/
public static void compress(File src, ZipOutputStream out, String base) throws
IOException … {
if (src.isDirectory()) …{ //如果是目录
File[] files = src.listFiles(); //列举出目录中所有的内容
out.putNextEntry(new ZipEntry(base +“/“)); //放入一级目录
base = base.length() ==0?”” : base +“/“;
for (int i =0; i < files.length; i++) …{
compress(files[i], out, base + files[i].getName());
}
}
else…{ //如果是文件
if(“”.equals(base))…{
out.putNextEntry(new ZipEntry(base+“/“));
base=src.getName();
}
out.putNextEntry(new ZipEntry(base));
FileInputStream in =new FileInputStream(src);
byte []data=newbyte[4096];
int b;
while((b=in.read(data))!=-1)…{
out.write(data,0,b);
}
in.close();
}
}
/** */ /**
* 解压缩文件
* @param src String zip所在路径c:/test/kk.zip
* @param des String 希望存放的目录
* @throws IOException
* @throws IOException
*/
public static void decompress(String src, String des) throws IOException
… {
ZipFile file=null;
FileOutputStream fout=null;
DataOutputStream dout=null;
try…{
file=new ZipFile(src);
InputStream in=null;
des=des.replace(‘/‘, ‘/‘);
if(des.startsWith(“//“))…{
des=des.replaceFirst(“//“, “//“);
}
Enumeration en=file.getEntries();
while(en.hasMoreElements())…{
ZipEntry entry=(ZipEntry)en.nextElement();
if(entry.isDirectory())…{ //文件夹
File directory=new File(des+“/“+entry.getName());
if(!directory.exists())
directory.mkdirs();
}else…{ //文件
String path=entry.getName();
path=path.replace(‘/‘, ‘/‘);
if(path.startsWith(“//“))…{
path=path.replaceFirst(“//“, “//“);
}
int pos=path.lastIndexOf(‘/‘);
if(pos!=-1)…{
path=path.substring(0, pos+1);
File d=new File(des+“/“+path);
if(!d.exists())
d.mkdirs();
}
try…{
File files=new File(entry.getName());
File f=new File(des+“/“+files.getPath());
fout=new FileOutputStream(f);
dout=new DataOutputStream(fout);
in=file.getInputStream(entry);
byte[] b=newbyte[4096];
int len =0;
while ( (len = in.read(b)) !=-1) …{
dout.write(b, 0, len);
}
}catch(IOException e)…{
throw e;
}finally…{
if(fout!=null)
fout.close();
if(dout!=null)
dout.close();
if(in!=null)
in.close();
}
}
}
}catch(IOException e)…{
throw e;
}finally…{
if(file!=null)
file.close();
if(fout!=null)
fout.close();
if(dout!=null)
dout.close();
}
}
/** */ /**
* 解压缩zip文件
* @param src String
* @param des String
* @return boolean 成功返回true;
*/
public static boolean zipDecompress(String src, String des) … {
boolean success =true;
try…{
decompress(src, des);
}
catch (FileNotFoundException ex) …{
ex.printStackTrace();
success =false;
}
catch (IOException ex) …{
ex.printStackTrace();
success =false;
}
return success;
}
该类有很多不完善的地方,各位可以提意见,共同交流,谢谢
还没有评论,来说两句吧...