java zip

来源:互联网 发布:vscode java 开发环境 编辑:程序博客网 时间:2024/06/06 00:14
//这个解压代码效果一般,不推荐. 
package mypackage.test; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 
/** */ 
/** 
* 使用java核心类库打包、解包zip文件。 
* 不足之处在于解压的 ZIP 文件中有中文文件名或有文件夹时,会解压失败 
* 在windows下解压后编码正常显示中文,而其他系统下则不能正常还原; 
*/ 
public class TestZip { 
/** */ 
/** 
* 定义解压缩zip文件的方法 
* @param zipFileName 
* @param outputDirectory 
*/ 
public void unzip(String zipFileName, String outputDirectory) { 
try { 
ZipInputStream in = new ZipInputStream(new FileInputStream( 
zipFileName)); 
//获取ZipInputStream中的ZipEntry条目,一个zip文件中可能包含多个ZipEntry, 
//当getNextEntry方法的返回值为null,则代表ZipInputStream中没有下一个ZipEntry, 
//输入流读取完成; 
ZipEntry z = in.getNextEntry(); 
while (z != null) { 
System.out.println("unziping: " + z.getName()); 
//创建以zip包文件名为目录名的根目录 
File f = new File(outputDirectory); 
f.mkdir(); 
if (z.isDirectory()) { 
String name = z.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 + z.getName()); 
f.createNewFile(); 
FileOutputStream out = new FileOutputStream(f); 
int b; 
while ((b = in.read()) != -1) { 
out.write(b); 

out.close(); 

//读取下一个ZipEntry 
z = in.getNextEntry(); 

in.close(); 
} catch (Exception e) { 
// TODO 自动生成 catch 块 
e.printStackTrace(); 


public static void main(String[] args) throws Exception { 
TestZip t = new TestZip(); 
t.unzip("D:/temp/mod0.zip", "D:/temp/mod0"); 
//一定要注意a.zip文件要经java程序压缩出来的文件,这个程序才可以解压 




//  这个可以解决中文文件夹,中文文件名等问题,强烈推荐! 
解 压zip文件,一开始用传统的jdk中的java.util.zip包中的类,实验结果对于含有英文文件名和英文目录的zip文件没有问题,但对于含有中 文文件名和中文目录的zip文件便解压不了,这是因为中文编码的问题,jdk本身有这个bug,虽然网上也有一些解决方案,但都没有试验成功。最后发现开 源库ant.jar中的org.apache.tools.zip包里的类可以解决上述问题,附代码如下: 
package mypackage.test; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
/** 
* 此例堪称完美,本人一直在用,强力推荐! 
* 这个可以很好的解决上一例中所遇到的问题,只是需要去下载一个 Ant.jar 包。 
*/ 
public class ZipFileOperUpdate { 
private void createDirectory(String directory, String subDirectory) { 
String dir[]; 
File fl = new File(directory); 
try { 
if (subDirectory == "" && fl.exists() != true) 
fl.mkdir(); 
else if (subDirectory != "") { 
dir = subDirectory.replace('\\', '/').split("/"); 
for (int i = 0; i < dir.length; i++) { 
File subFile = new File(directory + File.separator + dir); 
if (subFile.exists() == false) 
subFile.mkdir(); 
directory += File.separator + dir


} catch (Exception ex) { 
System.out.println(ex.getMessage()); 


public void unZip(String zipFileName, String outputDirectory) 
throws Exception { 
try {   
org.apache.tools.zip.ZipFile zipFile = new org.apache.tools.zip.ZipFile( 
zipFileName); 
java.util.Enumeration e = zipFile.getEntries(); 
org.apache.tools.zip.ZipEntry zipEntry = null; 
createDirectory(outputDirectory, ""); 
while (e.hasMoreElements()) { 

zipEntry = (org.apache.tools.zip.ZipEntry) e.nextElement(); 
System.out.println("unziping " + zipEntry.getName()); 

if (zipEntry.isDirectory()) { 
String name = zipEntry.getName(); 
name = name.substring(0, name.length() - 1); 
File f = new File(outputDirectory + File.separator + name); 
f.mkdir(); 
System.out.println("mkdir:" + outputDirectory 
+ File.separator + name); 
} else { 
String fileName = zipEntry.getName(); 
fileName = fileName.replace('\\', '/'); 
// System.out.println("测试文件1:" +fileName); 
if (fileName.indexOf("/") != -1) { 
createDirectory(outputDirectory, fileName.substring(0, 
fileName.lastIndexOf("/"))); 
fileName = fileName.substring( 
fileName.lastIndexOf("/") + 1, fileName 
.length()); 

File f = new File(outputDirectory + File.separator 
+ zipEntry.getName()); 
f.createNewFile(); 
InputStream in = zipFile.getInputStream(zipEntry); 
FileOutputStream out = new FileOutputStream(f); 
byte[] by = new byte[1024]; 
int c; 
while ((c = in.read(by)) != -1) { 
out.write(by, 0, c); 

out.close(); 
in.close(); 


} catch (Exception ex) { 
System.out.println(ex.getMessage()); 




trackback  :    http://www.gzas.org/kxybbs/asp/showtopic.asp?TopBh=1003810701 


//以下方法不太好,算是实现读取 zip 内文件内容的功能吧 
//文件名:myZip.java 
import java.io.*; 
import java.util.*; 
import java.util.zip.*; 
/** 
* <p>Title: 文件压缩和解压</p> 
* <p>Description: 使用ZipInputStream和ZipOutputStream对文件和目录进行压缩和解压处理</p> 
* <p>Copyright: Copyright (c) 2007</p> 
* <p>Filename: myZip.java</p> 
* @version 1.0 
*/ 
public class myZip{ 
/** 
*<br>方法说明:实现文件的压缩处理 
*<br>输入参数:String[] fs 压缩的文件数组 
*<br>返回类型: 
*/ 
public void ZipFiles(String[] fs){ 
try{ 
String fileName = fs[0]; 
FileOutputStream f = 
new FileOutputStream(fileName+".zip"); 
//使用输出流检查 
CheckedOutputStream cs = 
new CheckedOutputStream(f,new Adler32()); 
//声明输出zip流 
ZipOutputStream out = 
new ZipOutputStream(new BufferedOutputStream(cs)); 
//写一个注释 
out.setComment("A test of Java Zipping"); 
//对多文件进行压缩 
for(int i=1;i<fs.length;i++){ 
System.out.println("Write file "+fs); 
BufferedReader in = 
new BufferedReader( 
new FileReader(fs)); 
out.putNextEntry(new ZipEntry(fs)); 
int c; 
while((c=in.read())!=-1) 
out.write(c); 
in.close(); 

//关闭输出流 
out.close(); 
System.out.println("Checksum::"+cs.getChecksum().getValue()); 
}catch(Exception e){ 
System.err.println(e); 




/** 
*<br>方法说明:解压缩Zip文件 
*<br>输入参数:String fileName 解压zip文件名 
*<br>返回类型: 
*/ 
public void unZipFile(String fileName){ 
try{ 
System.out.println("读取ZIP文件........"); 
//文件输入流 
FileInputStream fi = 
new FileInputStream(fileName+".zip"); 
//输入流检查 
CheckedInputStream csi = new CheckedInputStream(fi,new Adler32()); 
//输入流压缩 
ZipInputStream in2 = 
new ZipInputStream( 
new BufferedInputStream(csi)); 
ZipEntry ze; 
System.out.println("Checksum::"+csi.getChecksum().getValue()); 
//解压全部文件 
while((ze = in2.getNextEntry())!=null){ 
System.out.println("Reading file "+ze); 
int x; 
while((x= in2.read())!=-1) 
//这里是写文件,write是以byte方式输出。 
System.out.write(x); 

in2.close(); 
}catch(Exception e){ 
System.err.println(e); 


/** 
*<br>方法说明:读取Zip文件列表 
*<br>输入参数:String fileName zip文件名 
*<br>返回类型:Vector 文件列表 
*/ 
public Vector listFile(String fileName){ 
try{ 
String[] aRst=null; 
Vector vTemp = new Vector(); 
//zip文件对象 
ZipFile zf = new ZipFile(fileName+".zip"); 
Enumeration e = zf.entries(); 
while(e.hasMoreElements()){ 
ZipEntry ze2 = (ZipEntry)e.nextElement(); 
System.out.println("File: "+ze2); 
vTemp.addElement(ze2); 

return  vTemp; 
}catch(Exception e){ 
System.err.println(e); 
return null; 


/** 
*<br>方法说明:主方法 
*<br>输入参数: 
*<br>返回类型: 
*/ 
public static void main(String[] args){ 
try{ 
String fileName = args[0]; 
myZip myZip = new myZip(); 
myZip.ZipFiles(args); 
myZip.unZipFile(fileName); 
Vector dd = myZip.listFile(fileName); 
System.out.println("File List: "+dd); 
}catch(Exception e){ 
e.printStackTrace(); 




--------------------------------------------ant.jar包---------------------------------- 
import java.io.*;   
import java.util.*; 
import java.io.File; 
import org.apache.tools.zip.*; 
public  class  CDGGzip   
{   
//boolean  packFrame  =  false;   
private File srcPath =new File("d:"+File.separator+"邢晓宁"); 
private String outFilename=new String("d:"+File.separator+"邢晓宁.zip"); 
private int len=srcPath.listFiles().length; 
private String[] filenames = new String[len]; 
public void setSrcPath(String src){ 
srcPath=new File(src); 

public File getSrcPath(){ 
return srcPath; 

public void setOutFilename(String out){ 
outFilename=out; 

public String getOutFilename(){ 
return outFilename; 
}   
public void gzip(){ 
byte[] buf = new byte[1024]; 
try { 
File[]  files  =  srcPath.listFiles(); 
for(int  i=0;i<len;i++) 

//if(!files.isDirectory()) 
filenames=srcPath.getPath()+File.separator+files.getName(); 

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename)); 
for (int i=0; i<filenames.length; i++) 

FileInputStream in = new FileInputStream(filenames); 
out.putNextEntry(new org.apache.tools.zip.ZipEntry(files.getName())); 
int len; 
while ((len = in.read(buf)) > 0) 

out.write(buf, 0, len); 

out.closeEntry(); 
in.close(); 

out.close(); 

catch (IOException e) 

System.out.println(e); 



public static void main(String arg[]){ 
CDGGzip cdggzip=new CDGGzip(); 
cdggzip.gzip(); 


}