org.apache.tools.zip压缩/解压文件文件夹

功能:zip压缩、解压(支持中文文件名)
说明:本程序通过使用Apache Ant里提供的zip工具org.apache.tools.zip实现了zip压缩和解压功能.
   解决了由于java.util.zip包不支持汉字的问题。
   使用java.util.zip包时,当zip文件中有名字为中文的文件时,
   就会出现异常:"Exception  in thread "main " java.lang.IllegalArgumentException  
               at   java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
注意:
   1、使用时把ant.jar放到classpath中,程序中使用import org.apache.tools.zip.*;
   2、Apache Ant 下载地址:[url]http://ant.apache.org/[/url]
   3、Ant ZIP API:[url]http://www.jajakarta.org/ant/ant-1.6.1/docs/mix/manual/api/org/apache/tools/zip/[/url]
   4、本程序使用Ant 1.7.1 中的ant.jar
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;

import org.apache.tools.zip.*;


public class ZipCompress {



public void zip(String inputFile, String zipFileName) {

zip(new File(inputFile), zipFileName);

}





public void zip(File inputFile, String zipFileName) {


try { FileOutputStream out = new FileOutputStream(new String(zipFileName.getBytes("gb2312"))); //创建文件输出对象out,提示:注意中文支持
ZipOutputStream zOut = new ZipOutputStream(out);

System.out.println("压缩-->开始");

zip(zOut, inputFile, "");

System.out.println("压缩-->结束");

zOut.close();

} catch (Exception e) {

e.printStackTrace();

}

}



public void zip(ZipOutputStream zOut, File file, String base) {

try {

System.out.println("正在压缩-->" + file.getName());

if (file.isDirectory()) {

File[] listFiles = file.listFiles();

zOut.putNextEntry(new ZipEntry(base + "/"));

base =( base.length() == 0 ? "" : base + "/" );

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

zip(zOut, listFiles[i], base + listFiles[i].getName());

// System.out.println(new String(listFiles[i].getName().getBytes("gb2312")));

}

} else {

if (base == "") {

base = file.getName();

}

zOut.putNextEntry(new ZipEntry(base));

System.out.println(file.getPath() + "," + base);

FileInputStream in = new FileInputStream(file);

int len;

while ((len = in.read()) != -1)

zOut.write(len);

in.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}

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[i]);

if (subFile.exists() == false)

subFile.mkdir();

directory += File.separator + dir[i];

}

}

} catch (Exception ex) {

System.out.println(ex.getMessage());

}

}

public void unZip(String zipFileName, String outputDirectory) {

try {

ZipFile zipFile = new ZipFile(zipFileName);

java.util.Enumeration e = zipFile.getEntries();

ZipEntry zipEntry = null;

createDirectory(outputDirectory, "");

while (e.hasMoreElements()) {

zipEntry = (ZipEntry) e.nextElement();

System.out.println("正在解压: " + zipEntry.getName());

String name = null;

if (zipEntry.isDirectory()) {

name = zipEntry.getName();

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

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

f.mkdir();

System.out.println("创建目录:" + 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();

}

// 删除文件不能在这里删,因为文件正在使用,应在上传那处删

// 解压后,删除压缩文件

// File zipFileToDel = new File(zipFileName);

// zipFileToDel.delete();

// System.out.println("正在删除文件:"+ zipFileToDel.getCanonicalPath());

// //删除解压后的那一层目录

// delALayerDir(zipFileName, outputDirectory);

}}catch (Exception ex) {

System.out.println(ex.getMessage());

}

}
/**
* 删掉一层目录
* @param zipFileName
* @param outputDirectory
*/
public void delALayerDir(String zipFileName, String outputDirectory) {

String[] dir = zipFileName.replace('\\', '/').split("/");

String fileFullName = dir[dir.length - 1];

int pos = -1;

pos = fileFullName.indexOf(".");

String fileName = fileFullName.substring(0, pos);

String sourceDir = outputDirectory + File.separator + fileName;

try {

copyFile(new File(outputDirectory), new File(sourceDir), new File(sourceDir));

deleteSourceBaseDir(new File(sourceDir));

} catch (Exception e) {

e.printStackTrace();

}

}


/**
* 将sourceDir目录的文件全部copy到destDir中去
*/
public void copyFile (File destDir, File sourceBaseDir, File sourceDir) throws Exception{

File[] lists = sourceDir.listFiles();

if (lists == null)

return;

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

File f = lists[i];

if (f.isFile()) {

FileInputStream fis = new FileInputStream(f);

String content = "";

String sourceBasePath = sourceBaseDir.getCanonicalPath();

String fPath = f.getCanonicalPath();

String drPath = destDir + fPath.substring(fPath.indexOf

(sourceBasePath) + sourceBasePath.length());

FileOutputStream fos = new FileOutputStream(drPath);

byte[] b = new byte[2048];

while (fis.read(b) != -1) {

if (content != null)

content += new String(b);

else

content = new String(b);

b = new byte[2048];

}



content = content.trim();

fis.close();

fos.write(content.getBytes());

fos.flush();

fos.close();

} else {

// 先新建目录

new File(destDir + File.separator + f.getName()).mkdir();

copyFile(destDir, sourceBaseDir, f); // 递归调用

}

}

}

/*
* 将sourceDir目录的文件全部copy到destDir中去
**/
public void deleteSourceBaseDir(File curFile) throws Exception {

File[] lists = curFile.listFiles();

File parentFile = null;

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

File f = lists[i];

if (f.isFile()) {

f.delete();

// 若它的父目录没有文件了,说明已经删完,应该删除父目录

parentFile = f.getParentFile();

if (parentFile.list().length == 0)

parentFile.delete();

} else {

deleteSourceBaseDir(f); // 递归调用

}

}

}

 测试util

	public static void main(String[] args) {   

	    ZipCompress t = new ZipCompress();   

	    // 这里是调用压缩的代码   

	     t.zip("c:\\test", "c:\\test.rar"); 

	    // 这里是调用解压缩的代码   

	     t.unZip("c:\\test.rar", "c:\\test1");   

	}     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值