package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
/*
import org.apache.tools.zip.ZipOutputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile; */
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 用ZIP压缩和解压缩文件或目录
*/
public class Zip {
private final static Log log = LogFactory.getLog(Zip.class);
/**
* 压缩文件或者目录
*
* @param baseDirName
* 压缩的根目录
* @param fileName
* 根目录下待压缩的文件或文件夹名, 星号*表示压缩根目录下的全部文件。
* @param targetFileName
* 目标ZIP文件
*/
public static void zipFile(String baseDirName, String targetFileName) {
// 检测根目录是否存在
if (baseDirName == null) {
log.info("压缩失败,根目录不存在:" + baseDirName);
return;
}
File file = new File(baseDirName);
if (!file.exists()) {
log.info("压缩失败,文件不存在:" + baseDirName);
return;
}
String baseDirPath = file.getAbsolutePath();
// 目标文件
File targetFile = new File(targetFileName);
try {
// 创建一个zip输出流来压缩数据并写入到zip文件
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
targetFile));
if (file.isFile()) {
Zip.fileToZip(baseDirPath, file, out);
} else {
Zip.dirToZip(baseDirPath, file, out);
}
out.close();
log.info("压缩文件成功,目标文件名:" + targetFileName);
} catch (IOException e) {
log.info("压缩失败:" + e);
e.printStackTrace();
}
}
/**
* 解压缩ZIP文件,将ZIP文件里的内容解压到targetDIR目录下
*
* @param zipName
* 待解压缩的ZIP文件名
* @param targetBaseDirName
* 目标目录
*/
public static void upzipFile(String zipFileName, String targetBaseDirName) {
if (!targetBaseDirName.endsWith(File.separator)) {
targetBaseDirName += File.separator;
}
try {
// 根据ZIP文件创建ZipFile对象
ZipFile zipFile = new ZipFile(zipFileName);
ZipEntry entry = null;
String entryName = null;
String targetFileName = null;
byte[] buffer = new byte[4096];
int bytes_read;
// 获取ZIP文件里所有的entry
Enumeration entrys = zipFile.entries();
// 遍历所有entry
while (entrys.hasMoreElements()) {
entry = (ZipEntry) entrys.nextElement();
// 获得entry的名字
entryName = entry.getName();
System.out.println(entryName);
targetFileName = targetBaseDirName + entryName;
if (entry.isDirectory()) {
// 如果entry是一个目录,则创建目录
new File(targetFileName).mkdirs();
continue;
} else {
// 如果entry是一个文件,则创建父目录
new File(targetFileName).getParentFile().mkdirs();
}
File targetFile = new File(targetFileName);
FileOutputStream os = new FileOutputStream(targetFile);
InputStream is = zipFile.getInputStream(entry);
while ((bytes_read = is.read(buffer)) != -1) {
os.write(buffer, 0, bytes_read);
}
// 关闭流
os.close();
is.close();
}
log.info("解压缩文件成功!");
} catch (IOException err) {
System.err.println("解压缩文件失败: " + err);
}
}
/**
* 将目录压缩到ZIP输出流。
*/
private static void dirToZip(String baseDirPath, File dir,
ZipOutputStream out) {
if (dir.isDirectory()) {
// 列出dir目录下所有文件
File[] files = dir.listFiles();
// 如果是空文件夹
if (files.length == 0) {
ZipEntry entry = new ZipEntry(getEntryName(baseDirPath, dir));
// 存储目录信息
try {
out.putNextEntry(entry);
out.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
return;
}
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
// 如果是文件,调用fileToZip方法
Zip.fileToZip(baseDirPath, files[i], out);
} else {
// 如果是目录,递归调用
Zip.dirToZip(baseDirPath, files[i], out);
}
}
}
}
/**
* 将文件压缩到ZIP输出流
*/
private static void fileToZip(String baseDirPath, File file,
ZipOutputStream out) {
FileInputStream in = null;
ZipEntry entry = null;
// 创建复制缓冲区
byte[] buffer = new byte[4096];
int bytes_read;
if (file.isFile()) {
try {
// 创建一个文件输入流
in = new FileInputStream(file);
// 做一个ZipEntry
entry = new ZipEntry(getEntryName(baseDirPath, file));
// 存储项信息到压缩文件
out.putNextEntry(entry);
// 复制字节到压缩文件
while ((bytes_read = in.read(buffer)) != -1) {
out.write(buffer, 0, bytes_read);
}
out.closeEntry();
in.close();
log.info("添加文件" + file.getAbsolutePath() + "被到ZIP文件中!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 获取待压缩文件在ZIP文件中entry的名字。即相对于跟目录的相对路径名
*
* @param baseDirPath
* @param file
* @return
*/
private static String getEntryName(String baseDirPath, File file) {
if (!baseDirPath.endsWith(File.separator)) {
baseDirPath += File.separator;
}
String filePath = file.getAbsolutePath();
// 对于目录,必须在entry名字后面加上"/",表示它将以目录项存储。
if (file.isDirectory()) {
filePath += "/";
}
int index = filePath.indexOf(baseDirPath);
return filePath.substring(index + baseDirPath.length());
}
public static void main(String[] args) {
// 压缩C盘下的temp目录,压缩后的文件是C:/temp.zip
/*
* String baseDirName = "C:/"; String fileName = "temp/"; String
* zipFileName = "C:/temp.zip";
*/
String baseDirName = "E:/plat";
String zipFileName = "E:/aa.zip";
Zip.upzipFile("d:/杂志.zip", "d:/");
Zip.zipFile("e:/123", "e:/123.zip");
// 将刚创建的ZIP文件解压缩到D盘的temp目录下
// System.out.println();
/*
* String zipFileName = "E:/plat.zip"; String fileName = "E:/plat1";
* upzipFile(zipFileName,fileName);
*/
// CompressUtil.zipFile(baseDirName, fileName, zipFileName);
}
}
分享到:
相关推荐
本文通过对数据压缩算法的简要介绍,然后以详细的示例演示了利用java.util.zip包实现数据的压缩与解压,并扩展到在网络传输方面如何应用java.util.zip包现数据压缩与解压
Java解压缩文件,并以ZIP格式压缩文件,主要是使用java.util.zip 包中的类来实现解压、压缩文件功能,如果你对这个类并不太熟悉,你正好可以参考一下这个类是如何用的。
Java完成zip压缩源码,包括修改后的java.util.zip下的文件(可以解决中文文件名的问题)
利用java.util.zip 包中提供的类来实现压缩和解压zip 格式文件的功能.rar
使用java.util.zip包将文件压缩成zip文件的Zipper类
博文链接:https://onlyLove.iteye.com/blog/228044
解决android 自带zip解压缩中文乱码的问题,导入zip.jar即可使用(与系统提供的用法相同),大小仅24k
import java.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; /** * * 类名: ZipUtil.java * 描述:压缩...
Java实现压缩与解压缩ZIP import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;...
项目中碰到问题.jdk zipEntry 压缩中文文件名乱码 上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项. 第二种 就是拿来主义,因为 开源项目 Ant 里已经有...
有些时候需要替换zip内的文件。 网上的办法大多是——先解压,然后对解压目录替换文件,最后再重新压缩。该办法需要比较繁琐,且需要一个临时目录。 于是想找无需解压的方案。 后来找到利用 ZipInputStream、...
在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...
用Java压缩解压ZIP文件,将利用java.util.zip 包中提供的类来实现压缩和解压zip 格式文件的功能。当然,本例在功能上完全没有Winzip 等成熟的压缩软件那么强,也不能做的很强,本例仅仅是演示如何来使用java.util....
import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class ZipUtils { private static final int BUFFER = 8192; private static void log...
zip压缩预解压多文件,提供两种方法:一,用java自带方式java.util.zip;二,应用apache的jar包,org.apache.commons.compress.archivers.zip
压缩API:Java提供了java.util.zip和java.util.jar包来实现文件的压缩和解压缩操作。 压缩算法:通过选择不同的压缩算法,如DEFLATE算法用于ZIP格式,实现对文件的压缩。 流操作:使用Java的输入输出流(InputStream...
用java.util.zipoutputstream压缩会出现中文的文件名乱码的情况,且无法设置字符集,这个版本用org.apache.tools.zip.ZipOutputStream压缩,可以自定义字符集,解决中文的文件名乱码问题。
使用java自带的类 java.util.zip进行文件/目录的压缩的话,有一点不足,不支持中文的名件/目录命名,如果有中文名,那么打包就会失败。本人经过一段时间的摸索和实践...
一个纯Java压缩库,适合作为java.util.zip当前本机实现的直接替代。 有用的典型场景是小应用程序,不允许访问本机代码。 它也可能在平台上有用
java.util.zip工具包里面的类实现文件夹的zip压缩。具体会用到FileInputStream,CheckedOutputStream,BufferedInputStream,ZipOutputStream.