由于工作需要,需要将zip的压缩文件进行解压,经过调查发现,存在两个开源的工具包,一个是Apache的ant工具包,另一个就是Java api自带的工具包;但是Java自带的工具包存在问题:如果压缩或者解压的文件存在非英文字符(比如中文、以色列文),在操作的过程中会存在问题:MALFORMAL Eception……

以下是通过Apache的zip工具包进行压缩和解压的代码(需要ant.jar):

package com.steven.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List; import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream; /**
* 压缩或解压zip:
* 由于直接使用java.util.zip工具包下的类,会出现中文乱码问题,所以使用ant.jar中的org.apache.tools.zip下的工具类
* @author Administrator
*/ public class ZipUtil { /**
* 压缩文件或路径
* @param zip 压缩的目的地址
* @param srcFiles 压缩的源文件
*/
public static void zipFile( String zip , List<File> srcFiles ){
try {
if( zip.endsWith(".zip") || zip.endsWith(".ZIP") ){
ZipOutputStream _zipOut = new ZipOutputStream(new FileOutputStream(new File(zip))) ;
_zipOut.setEncoding("GBK");
for( File _f : srcFiles ){
handlerFile(zip , _zipOut , _f , "");
}
_zipOut.close();
}else{
System.out.println("target file[" + zip + "] is not .zip type file");
}
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
} /**
*
* @param zip 压缩的目的地址
* @param zipOut
* @param srcFile 被压缩的文件信息
* @param path 在zip中的相对路径
* @throws IOException
*/
private static void handlerFile(String zip , ZipOutputStream zipOut , File srcFile , String path ) throws IOException{
System.out.println(" begin to compression file[" + srcFile.getName() + "]");
if( !"".equals(path) && ! path.endsWith(File.separator)){
path += File.separator ;
}
if( ! srcFile.getPath().equals(zip) ){
if( srcFile.isDirectory() ){
File[] _files = srcFile.listFiles() ;
if( _files.length == 0 ){
zipOut.putNextEntry(new ZipEntry( path + srcFile.getName() + File.separator));
zipOut.closeEntry();
}else{
for( File _f : _files ){
handlerFile( zip ,zipOut , _f , path + srcFile.getName() );
}
}
}else{
byte[] _byte = new byte[1024] ;
InputStream _in = new FileInputStream(srcFile) ;
zipOut.putNextEntry(new ZipEntry(path + srcFile.getName()));
int len = 0 ;
while( (len = _in.read(_byte)) > 0 ){
zipOut.write(_byte, 0, len);
}
_in.close();
zipOut.closeEntry();
}
}
} /**
* 解压缩ZIP文件,将ZIP文件里的内容解压到targetDIR目录下
* @param zipPath 待解压缩的ZIP文件名
* @param descDir 目标目录
*/
public static List<File> upzipFile(String zipPath, String descDir) {
return upzipFile( new File(zipPath) , descDir ) ;
} /**
* 对.zip文件进行解压缩
* @param zipFile 解压缩文件
* @param descDir 压缩的目标地址,如:D:\\测试 或 /mnt/d/测试
* @return
*/
@SuppressWarnings("rawtypes")
public static List<File> upzipFile(File zipFile, String descDir) {
List<File> _list = new ArrayList<File>() ;
try {
ZipFile _zipFile = new ZipFile(zipFile , "GBK") ;
for( Enumeration entries = _zipFile.getEntries() ; entries.hasMoreElements() ; ){
ZipEntry entry = (ZipEntry)entries.nextElement() ;
File _file = new File(descDir + File.separator + entry.getName()) ;
if( entry.isDirectory() ){
_file.mkdirs() ;
}else{
byte[] _byte = new byte[1024] ;
File _parent = _file.getParentFile() ;
if( !_parent.exists() ){
_parent.mkdirs() ;
}
InputStream _in = _zipFile.getInputStream(entry);
OutputStream _out = new FileOutputStream(_file) ;
int len = 0 ;
while( (len = _in.read(_byte)) > 0){
_out.write(_byte, 0, len);
}
_in.close();
_out.flush();
_out.close();
_list.add(_file) ;
}
}
} catch (IOException e) {
}
return _list ;
} /**
* 对临时生成的文件夹和文件夹下的文件进行删除
*/
public static void deletefile(String delpath) {
try {
File file = new File(delpath);
if (!file.isDirectory()) {
file.delete();
} else if (file.isDirectory()) {
String[] filelist = file.list();
for (int i = 0; i < filelist.length; i++) {
File delfile = new File(delpath + File.separator + filelist[i]);
if (!delfile.isDirectory()) {
delfile.delete();
} else if (delfile.isDirectory()) {
deletefile(delpath + File.separator + filelist[i]);
}
}
file.delete();
}
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
upzipFile("steven.zip","D://test");
} }

以下是Java api 中Java.util.zip包下面自带的压缩和解压缩的工具包实现的代码(如果文件名存在非英文编码会出现问题):

package testzip;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile; import org.apache.commons.io.IOUtils; public class ZipTest { /**
* Unzip it
*
* @param zipFile
* input zip file
* @param output
* zip file output folder
* @throws IOException
*/
public static void unZipIt(String file, String outputFolder)
throws IOException {
ZipFile zipFile = new ZipFile(file);
try {
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
File entryDestination = new File(outputFolder, entry.getName());
if (entry.isDirectory()) {
entryDestination.mkdirs();
} else {
entryDestination.getParentFile().mkdirs();
InputStream in = zipFile.getInputStream(entry);
OutputStream out = new FileOutputStream(entryDestination);
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
out.close();
}
}
} finally {
zipFile.close();
}
} public static void main(String[] args) throws Exception {
unZipIt("test.zip","D://test");
}
}

  

Java实现压缩文件与解压缩文件的更多相关文章

  1. 用命令提示符压缩文件,解压缩文件(不需要客户端安装7zip)

    压缩成一个CAB包的办法: type list.txt (生成一个文件列表) makecab /f list.txt /d compressiontype=mszip /d compressionme ...

  2. Java编程的逻辑 (64) - 常见文件类型处理: 属性文件/CSV/EXCEL/HTML/压缩文件

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  3. Java实现解压缩文件和文件夹

    一 前言 项目开发中,总会遇到解压缩文件的时候.比如,用户下载多个文件时,服务端可以将多个文件压缩成一个文件(例如xx.zip或xx.rar).用户上传资料时,允许上传压缩文件,服务端进行解压读取每一 ...

  4. 【Linux】【二】linux 压缩文件(txt)、查看压缩文件内容、解压缩文件、

    通过Xshell 压缩文件.解压缩文件 gzip tools.txt 压缩[tools.txt]文件 zcat tools.txt.gz   查看压缩文件[tools.txt.gz]内容 gunzip ...

  5. ZIP解压缩文件的工具类【支持多级文件夹|全】

    ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...

  6. ZIP解压缩文件的工具类【支持多级目录|全】

    ZIP解压缩文件的工具类[支持多级目录|全] 作者:Vashon 网上有很多的加压缩示例代码,但是都只是支持一级目录的操作,如果存在多级目录的话就不行了.本解压缩工具类经过多次检查及重构,最终分享给大 ...

  7. C#工具类:使用SharpZipLib进行压缩、解压文件

    SharpZipLib是一个开源的C#压缩解压库,应用非常广泛.就像用ADO.NET操作数据库要打开连接.执行命令.关闭连接等多个步骤一样,用SharpZipLib进行压缩和解压也需要多个步骤.Sha ...

  8. LInux 解压缩文件

    常用命令有2个,一个是tar,一个是zip,二选一就行 有的服务器没有安装zip命令,就只有tar可以用,我个人建议还是安装一个zip好一些,tar实在太繁琐 1.解压 tar -zxvf ./xxx ...

  9. java实现单个或多个文件的压缩、解压缩 支持zip、rar等格式

    代码如下: package com.cn.util; import java.io.BufferedInputStream; import java.io.File; import java.io.F ...

随机推荐

  1. MyFirstServlet学习笔记

    MyFirstServlet学习笔记 项目文件的结构目录如下,ser包,下设Serv.java是一个servlet文件,Note只是做的笔记,webroot下有login.jsp,WEB-INF下有w ...

  2. SQL基本编程,分支语句,循环语句,存储过程,触发器

    基本编程: 定义变量 declare @变量名 数据类型 赋值 set @变量名 = 值 select @变量名 = 值 取值打印 select @变量名 print @变量名 映射到结果集 打印到消 ...

  3. TFS2017代码搜索功能

    当团队或者公司的研发中心的代码库扩展到了一定程度,在代码库中查找一些需要的代码会变的比较困难.比如敏捷模式下的项目小组希望能够找到并重用其他小组开发的一些基础性的功能代码,我们通常需要去找当事人去询问 ...

  4. @ModelAttribute--SpringMVC 注解系列文章(二)

    概述 在日常的开发工作中,更新操作是经常会涉及到的一个功能,但是对于一条记录的更新,往往只会更新一部分的信息,而不会整条记录都更新,比如修改用户年龄的时候,用户密码是不需要修改的,针对这种情况,处理的 ...

  5. iOS开发之JSON & XML

    1.概述 JSON (1) 作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 (2) 基于JavaScript的一个子集 (3) 易读性略差,编码手写难度大,数据量小 (4) ...

  6. 使用moment.js轻松管理日期和时间

    大家在前端Javascript开发中会遇到处理日期时间的问题,经常会拿来一大堆处理函数才能完成一个简单的日期时间显示效果.今天我给大家介绍一个轻量级的Javascript日期处理类库:moment.j ...

  7. js中prototype,__proto__,constructor之间的关系

    首先,我们需要了解三点: 1. 只要创建一个任意新函数,就会根据一个prototype属性,该属性指向函数的原型对象: 2. 每一个原型对象都会自动获得一个constructor属性,该属性只想pro ...

  8. javaweb浏览器随机输出一张验证码图片

    一.在web.xml中的配置如下: <?xml version="1.0" encoding="UTF-8"?><web-app xmlns: ...

  9. 转载八个最佳Python IDE

    八个最佳Python IDE 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Python是一种功能强大.语言简洁的编程语言.本文向大家推荐8个适合Pyt ...

  10. 01.PHP5.x编译详解

    ##PHP5.5编译安装 ``` wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum i ...