/**
*
*/
package
com.yfei.uti.zip;
import
java.io.BufferedInputStream;
import
java.io.BufferedOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
* @author yangfei
* @since 2013-1-27
*/
public
class
ZipUtilApache
static
final
int
BUFFER =
1024
;
public
static
void
zip(String destDirPath, String inputPath)
throws
Exception {
File inputFile =
new
File(inputPath);
// 创建压缩文件
File destDir =
new
File(destDirPath);
if
(!destDir.exists()) {
destDir.mkdir();
}
File destFile =
new
File(destDir + File.separator + inputFile.getName()
+
".zip"
);
// 递归压缩方法
ZipOutputStream
new
ZipOutputStream(
new
FileOutputStream(destFile));
// 设置压缩编码.设置为GBK后在windows下就不会乱码了,如果要放到Linux或者Unix下就不要设置了
out.setEncoding(
"GBK"
);
zip(out, inputFile,
""
);
System.out.println(
"zip done"
);
out.close();
}
private
static
void
zip(ZipOutputStream out, File f, String base)
throws
Exception {
System.out.println(
"Zipping "
+ f.getName());
// 记录日志,开始压缩
if
(f.isDirectory()) {
// 如果是文件夹,则获取下面的所有文件
File[] fl = f.listFiles();
if
(base.length() >
0
) {
out.putNextEntry(
new
ZipEntry(base +
"/"
));
// 此处要将文件写到文件夹中只用在文件名前加"/"再加文件夹名
}
base = base.length() ==
0
?
""
: base +
"/"
;
for
(
int
i =
0
; i < fl.length; i++) {
zip(out, fl[i], base + fl[i].getName());
}
}
else
{
// 如果是文件,则压缩
out.putNextEntry(
new
ZipEntry(base));
// 生成下一个压缩节点
FileInputStream in =
new
FileInputStream(f);
// 读取文件内容
int
len;
byte
[] buf =
new
byte
[BUFFER];
while
((len = in.read(buf,
0
, BUFFER)) != -
1
) {
out.write(buf,
0
, len);
// 写入到压缩包
}
in.close();
out.closeEntry();
}
}
/**
* 解压缩zip文件
*
* @param fileName
* 要解压的文件名 包含路径 如:"c:\\test.zip"
* @param filePath
* 解压后存放文件的路径 如:"c:\\temp"
* @throws Exception
*/
public
static
void
unZip(String fileName, String destFilePath)
throws
Exception {
ZipFile
new
ZipFile(fileName,
"GBK"
);
// 以“GBK”编码创建zip文件,用来处理winRAR压缩的文件。
Enumeration emu = zipFile.getEntries();
while
(emu.hasMoreElements()) {
ZipEntry entry = (ZipEntry) emu.nextElement();
if
(entry.isDirectory()) {
File dir =
new
File(destFilePath + entry.getName());
if
(!dir.exists()) {
dir.mkdirs();
}
continue
;
}
BufferedInputStream bis =
new
BufferedInputStream(zipFile
.getInputStream(entry));
File file =
new
File(destFilePath + entry.getName());
File parent = file.getParentFile();
if
(parent !=
null
&& (!parent.exists())) {
parent.mkdirs();
}
FileOutputStream fos =
new
FileOutputStream(file);
BufferedOutputStream bos =
new
BufferedOutputStream(fos, BUFFER);
byte
[] buf =
new
byte
[BUFFER];
int
len =
0
;
while
((len = bis.read(buf,
0
, BUFFER)) != -
1
) {
fos.write(buf,
0
, len);
}
bos.flush();
bos.close();
bis.close();
System.out.println(
"解压文件:"
+ file.getName());
}
zipFile.close();
}
}
使用ant提供的zip进行压缩和解压缩,支持中文
原创
©著作权归作者所有:来自51CTO博客作者nethub的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
ant压缩和解压缩工具类
<!--文件压缩和解压工具类--> <dependency> <groupId>org.apache.ant<
Ant 压缩文件 apache 解压缩 -
使用GZipStream实现压缩和解压缩
之前做项目,涉及到存入到数据库或者http传输的数据量比较大,这个时候,就需要考虑在存入数据库或者发送传输之前,
java 开发语言 源文件 数据库 数据格式 -
文件的压缩和解压缩
(1)说明 (2)相关代码
压缩文件 hive 依赖库 cocoa 文件压缩