java zip

//这个解压代码效果一般,不推荐.
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);
}
returnvTemp;
}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.*;
publicclassCDGGzip
{
//booleanpackFrame=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(inti=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();
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值