设为首页 收藏本站
查看: 288|回复: 0

[经验分享] org.apache.tools.zip压缩/解压文件文件夹

[复制链接]

尚未签到

发表于 2017-1-10 10:01:44 | 显示全部楼层 |阅读模式
功能: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 下载地址:http://ant.apache.org/
   3、Ant ZIP API:http://www.jajakarta.org/ant/ant ... g/apache/tools/zip/
   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, base + listFiles.getName());

// System.out.println(new String(listFiles.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);

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) {

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;

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;

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");   
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-326408-1-1.html 上篇帖子: Apache Tomcat 6.0.20 的Jsp环境配置 下篇帖子: Apache启用GZIP压缩优化网站(GZIP、网站优化)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表