使用JAVA本身的ZIP API打包带有中文名称的文件(目录)会出现乱码,且winzip无法解压,如果要解决此问题,可以将
import java.util.zip.ZipOutputStream;
import java.util.zip.ZipEntry;
换为ant.jar中的API
/**
* 压缩文件(.zip)的函数
* @param zipDirectory:(需要)压缩的文件夹路径
* @param zipPath:文件压缩后放置的路径,该路径可以为null,null表示压缩到原文件的同级目录
* @return :返回一个压缩好的文件(File),否则返回null
*/
public File doZip(String zipDirectory, String zipPath) {
File zipDir = new File(zipDirectory);
if (zipPath == null) {
zipPath = zipDir.getParent();
}
// 压缩后生成的zip文件名
String zipFileName = zipPath + "/" + zipDir.getName() + ".zip";
try {
zipOut = new ZipOutputStream(new BufferedOutputStream(
new FileOutputStream(zipFileName)));
// 压缩文件
handleDir(zipDir, zipDir.getParent().length() + 1, zipOut);
zipOut.close();
return new File(zipFileName);
} catch (IOException e) {
logger.error(e);
e.printStackTrace();
return null;
}
}
/**
* 由doZip调用,递归完成目录文件读取
* @param dir:(需要)压缩的文件夹(File 类型)
* @param len:一个参数(记录压缩文件夹的parent路径的长度)
* @param zipOut:需要压缩进的压缩文件
* @throws IOException:如果出错,会抛出IOE异常
*/
private void handleDir(File dir, int len, ZipOutputStream zipOut)
throws IOException {
FileInputStream fileIn = null;
File[] files = dir.listFiles();
if (files != null) {
if (files.length > 0) { // 如果目录不为空,则分别处理目录和文件.
for (File fileName : files) {
if (fileName.isDirectory()) {
handleDir(fileName, len, zipOut);
} else {
fileIn = new FileInputStream(fileName);
zipOut.putNextEntry(new ZipEntry(fileName.getPath()
.substring(len).replaceAll("\\\\", "/")));
while ((readedBytes = fileIn.read(buf)) > 0) {
zipOut.write(buf, 0, readedBytes);
}
zipOut.closeEntry();
}
}
} else { // 如果目录为空,则单独创建之.
zipOut.putNextEntry(new ZipEntry(dir.getPath().substring(len)
+ "/"));
zipOut.closeEntry();
}
} else {// 如果是一个单独的文件
fileIn = new FileInputStream(dir);
zipOut.putNextEntry(new ZipEntry(dir.getPath().substring(len)));
while ((readedBytes = fileIn.read(buf)) > 0) {
zipOut.write(buf, 0, readedBytes);
}
zipOut.closeEntry();
}
}
/**
* 解压指定zip文件
* @param unZipfileName:需要解压的zip文件路径
* @param unZipPath:文件解压的路径,该路径可以为null,null表示解压到原文件的同级目录
*/
public boolean unZip(String unZipfileName, String unZipPath) {// unZipfileName需要解压的zip文件名
FileOutputStream fileOut = null;
InputStream inputStream = null;
File file = null;
if (unZipPath == null) {
unZipPath = new File(unZipfileName).getParent();
// System.out.println("1 -> " + unZipPath);
if (!(unZipPath.substring(unZipPath.length()).endsWith("/") || unZipPath
.substring(unZipPath.length()).endsWith("\\"))) {
unZipPath += "/";
}
} else {
unZipPath = new File(unZipPath).getPath() + "/";
}
try {
zipFile = new ZipFile(unZipfileName);
for (Enumeration<?> entries = zipFile.getEntries(); entries
.hasMoreElements();) {
ZipEntry entry = (ZipEntry) entries.nextElement();
int iTEMP = entry.getName().indexOf("/") + 1;
file = new File(unZipPath
+ entry.getName().substring(iTEMP,
entry.getName().length()));
if (entry.isDirectory()) {
file.mkdirs();
} else {
// 如果指定文件的目录不存在,则创建之.
File parent = file.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
inputStream = zipFile.getInputStream(entry);
fileOut = new FileOutputStream(file);
while ((this.readedBytes = inputStream.read(this.buf)) > 0) {
fileOut.write(this.buf, 0, this.readedBytes);
}
fileOut.close();
inputStream.close();
}
}
this.zipFile.close();
return true;
} catch (IOException ioe) {
logger.error(ioe);
ioe.printStackTrace();
return false;
}
}
分享到:
相关推荐
NULL 博文链接:https://alog2012.iteye.com/blog/1616684
java控制指定路径下的文件夹压缩成zip格式。 java将zip压缩包解压成为文件夹。直接使用io流进行操作,不需借助其他jar包
主要介绍了基于Java向zip压缩包追加文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
应用java来压缩需要打包的文件,在系统管理中将毛哥路径或者某个文件夹压缩成zip包
1,pic_open.zip<br>带位图预览的打开文件对话框(4KB)<END><br>2,bmpdlg.zip<br>一个位图对话框类 (11KB)<END><br>3,folder.zip<br>只显示文件夹信息的文件对话框(2KB)<END><br>4,dir_pic.zip<br>文件目录搜集工具...
<br><br> * WinRAR 对 RAR 和 ZIP 2.0 格式压缩文件提供完整支持,并可以解压 CAB、<br> ARJ、LZH、TAR、GZ、ACE、UUE、BZ2、JAR、ISO、Z、7Z 等压缩文件。<br><br> * WinRAR 支持 NTFS 的文件安全和数据流。<br> ...
edge.zip<br>实现图案化和抖动技术以及bmp2txt源代码(34KB)<END><br>60,compress.zip<br>图象的几何变换算法(128KB)<END><br>61,tga2gif.zip<br>TGA文件转换为GIF文件。(14KB)<END><br>62,tooltip.zip<br>可以多行...
例如xml文件的形式是<student><age>1</age><age2>2</age2></student>,在Java文件中设置demo路径,要替换的值,最后分别生成xml文件,例如要换成aa,则xml两个,一个为<student><age>aa</age><age>2</age></student>,...
包含了使用的jar包,以及一个Java类,实现了使用Java对多目录多层级的文件进行打包,以及对ZIP包进行解压缩的操作。
Java根据Url把多个文件下载到指定的文件夹目录,然后再将文件夹目录打包成zip导出,包括子目录也可以打包,有个简单的导出html页面,点击导出按钮下载zip。
(73KB)<br>121,i012.zip<br>如何在vb中调用i/o口的例子(10KB)<br>122,i011.zip<br>演示连接/断开network(3KB)<br>123,i010.zip<br>chat程序例子(12KB)<br>124,i009.zip<br>简单的邮件发送例子 (13KB)<br>125,i008....
主要为大家详细介绍了java后台批量下载文件并压缩成zip下载的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
光线文字(33KB)<END> 2,hrwz.zip 环绕旋转字(5KB)<END> 3,kzfwz.zip 空中飞舞字(6KB)<END> 4,sdwz.zip 闪电文字(6KB)<END> 5,sjlz2.zip 数据流字(8KB)<END> 6,twfz1.zip 天外飞字1(5KB)<END> 7,twfz2.zip...
1,WINAPI_OCX.zip<br>封装了部分Windows API的控件(92KB)<END><br>2,HeaderCtrl.zip<br>多行标题的CListCtrl(19KB)<END><br>3,RoundBut.zip<br>你需要圆形的按钮吗?这个类已经替你做好了,它可是有正常、平面、下推...
* @param targetPath 解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下 * void<br> */ public static void unzip(String zipFilePath, String targetPath) throws ...
QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库.适用于多种平台,利用它可以很方便的将单个或多个文件打包为zip文件,且打包后...<4> 调用Quazip压缩文件夹和解压zip文件的例子源码(完整的项目源码)
java.util.zip工具包里面的类实现文件夹的zip压缩。具体会用到FileInputStream,CheckedOutputStream,BufferedInputStream,ZipOutputStream.
zip解压缩文件文件夹都可以,代码清晰,注释多。非常容易看懂
* @param isCreateDir 是否在压缩文件里创建目录,仅在压缩文件为目录时有效.<br /> * 如果为false,将直接压缩目录下文件到压缩文件. * @param passwd 压缩使用的密码 * @return 最终的压缩文件存放的绝对路径,...
// 设置压缩文件入口entry,为被读取的文件创建压缩条目 File tempFile = new File(fileArray[i].toString()); String rootStr = file.getPath(); String entryStr = null; // entry以相对路径的...