- 浏览: 229879 次
- 性别:
- 来自: beijing
文章分类
package com.cee.zip.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; 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 java.util.zip.ZipFile; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; public class ZipUtil { /** * * zip压缩功能测试. 此方法可保留被压缩文件的目录结构 注意是压缩文件夹。 * * @param baseDir * 所要压缩的目录名(包含绝对路径) * @param objFileName * 压缩后的文件名 * @throws Exception */ public static void createZip(String baseDir, String objFileName) throws Exception { File folderObject = new File(baseDir); if (folderObject.exists()) { List fileList = getSubFiles(new File(baseDir)); // 压缩文件名 ZipOutputStream zos = new ZipOutputStream(new FileOutputStream( objFileName)); ZipEntry ze = null; byte[] buf = new byte[1024]; int readLen = 0; for (int i = 0; i < fileList.size(); i++) { File f = (File) fileList.get(i); System.out.println("Adding: " + f.getPath() + f.getName()); /* * 创建一个ZipEntry,并设置Name和其它的一些属性 * 注意,该ZipEntry是包含目录结构的,此功能是由getAbsFileName(String,string)完成的 */ ze = new ZipEntry(getAbsFileName(baseDir, f)); ze.setSize(f.length()); ze.setTime(f.lastModified()); // 将ZipEntry加到zos中,再写入实际的文件内容 zos.putNextEntry(ze); InputStream is = new BufferedInputStream(new FileInputStream(f)); while ((readLen = is.read(buf, 0, 1024)) != -1) { zos.write(buf, 0, readLen); } is.close(); System.out.println("done..."); } zos.close(); } else { throw new Exception("this folder isnot exist!"); } } /** * 对某一个文件进行压缩,不允许是目录或包含子目录 压缩文件 * * @param sourceFileName * 被压缩的目标文件,不允许是目录或包含子目录 * @param zipFilename * 为压缩后的文件指定的名称 * @return 压缩文件的大小 * @throws Exception */ public static long createFileToZip(String sourceFileName, String zipFilename) throws Exception { File sourceFile = new File(sourceFileName); byte[] buf = new byte[1024]; // 压缩文件名 File objFile = new File(zipFilename); ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile)); ZipEntry ze = null; // 创建一个ZipEntry,并设置Name和其它的一些属性 ze = new ZipEntry(sourceFile.getName()); ze.setSize(sourceFile.length()); ze.setTime(sourceFile.lastModified()); // 将ZipEntry加到zos中,再写入实际的文件内容 zos.putNextEntry(ze); InputStream is = new BufferedInputStream( new FileInputStream(sourceFile)); int readLen = -1; while ((readLen = is.read(buf, 0, 1024)) != -1) { zos.write(buf, 0, readLen); } is.close(); zos.close(); return objFile.length(); } /** * 测试解压缩功能. 将d:\\download\\test.zip连同子目录解压到d:\\temp\\zipout目录下. * * @param sourceZip * 待解压的zip文件 * @param outFileName * @throws IOException */ public static void releaseZipToFile(String sourceZip, String outFileName) throws IOException { ZipFile zfile = new ZipFile(sourceZip); System.out.println("待解压的文件是: " + zfile.getName()); Enumeration zList = zfile.entries(); ZipEntry ze = null; byte[] buf = new byte[1024]; while (zList.hasMoreElements()) { // 从ZipFile中得到一个ZipEntry ze = (ZipEntry) zList.nextElement(); if (ze.isDirectory()) { continue; } // 以ZipEntry为参数得到一个InputStream,并写到OutputStream中 InputStream is = new BufferedInputStream(zfile.getInputStream(ze)); OutputStream os = new BufferedOutputStream(new FileOutputStream( getRealFileName(outFileName, ze.getName()))); int readLen = 0; while ((readLen = is.read(buf, 0, 1024)) != -1) { os.write(buf, 0, readLen); } is.close(); os.close(); System.out.println("Extracted: " + ze.getName()); } zfile.close(); } /** * 取得指定目录以及其各级子目录下的所有文件的列表,注意,返回的列表中不含目录. * * @param baseDir * File 指定的目录 * @return 包含java.io.File的List */ private static List getSubFiles(File baseDir) { List fileList = new ArrayList(); File[] tmp = baseDir.listFiles(); for (int i = 0; i < tmp.length; i++) { // 如果是文件,直接加入fileList if (tmp[i].isFile()) { fileList.add(tmp[i]); } // 如果是目录,递归调用本方法,并将结果集加入fileList if (tmp[i].isDirectory()) { fileList.addAll(getSubFiles(tmp[i])); } } return fileList; } /** * 给定根目录,返回一个相对路径所对应的实际文件名. * * @param baseDir * 指定根目录 * @param absFileName * 相对路径名,来自于ZipEntry中的name * @return java.io.File 实际的文件 */ private static File getRealFileName(String baseDir, String absFileName) { String[] dirs = absFileName.split("/"); File ret = new File(baseDir); // 创建目录结构 if (dirs.length > 1) { for (int i = 0; i < dirs.length - 1; i++) { ret = new File(ret, dirs[i]); } } if (!ret.exists()) { ret.mkdirs(); } ret = new File(ret, dirs[dirs.length - 1]); return ret; } /** * 给定根目录及文件的实际路径,返回带有相对路径的文件名,用于zip文件中的路径. * 如将绝对路径,baseDir\dir1\dir2\file.txt改成 dir1/dir2/file.txt * * @param baseDir * java.lang.String 根目录 * @param realFileName * java.io.File 实际的文件名 * @return 相对文件名 */ private static String getAbsFileName(String baseDir, File realFileName) { File real = realFileName; File base = new File(baseDir); String ret = real.getName(); while (true) { real = real.getParentFile(); if (real == null) break; if (real.equals(base)) break; else { ret = real.getName() + "/" + ret; } } return ret; } public static void main(String args[]) { ZipUtil zu = new ZipUtil(); long begin = System.currentTimeMillis(); try { // manager.releaseZipToFile("d:\\download\\src.zip", // "d:\\temp\\zipout"); zu.createZip("c:\\Downloads", "c:\\temp\\out.zip"); zu.createFileToZip("c:\\test.txt", "hh.zip"); } catch (Exception e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println(end - begin + "over"); } }
发表评论
-
二进制 授权管理 java
2013-09-09 12:52 906package org.qincy.binary; ... -
com.richfit.bi.quartz 定时执行示例
2013-04-12 15:39 01 内含jetty 配置,下载jetty 依赖包,算了,还是提 ... -
利用工具将shp文件导入到oracle spatial中
2012-05-21 14:20 43901 下载shp2sdo 工具,将工具放在 oracle按照目录 ... -
Arcgis object for java 访问栅格数据,使用GP工具,进行栅格矢量化---栅格矢量化面。
2012-06-20 09:17 4137直接贴代码了,不多解释了。 1、栅格数据的 ... -
svn 删除注册表
2012-02-11 12:02 1552svn 删除注册表 -
arcgis server 服务
2012-01-06 17:58 1182package com.hdmap.fymas; imp ... -
Flex BlazeDS java 项目
2011-12-12 17:21 1096根据网上的例子 ,写的 flex BlazeDS 框架与 ... -
工具类
2011-02-18 14:05 977英文数字转换为 中文数字 public class Mon ... -
junit 4 spring 自动化测试
2010-12-13 16:08 16391 添加jar ,依赖jar 包围 spring-test, ... -
在tomcat 发布,去掉项目名称
2010-11-17 09:53 19641 找到 server.xml 配置= ... -
掉字段内容包含的空格
2010-09-27 10:17 980使用replace函数去掉字段内容包含的空格,例子如下: up ... -
无聊的jsti 的fn 函数(资料备份)
2010-09-25 17:16 978无聊的jsti 的fn 函数(资料备份) ... -
无聊写Code
2010-09-25 09:38 1004package edu.qdkj.main; impor ... -
Spring Quartz 学习
2010-09-20 09:27 1172Quartz 是一个 定时执行的框架,可以设定规定时执行,或者 ... -
kaptcha 例子
2010-09-13 15:09 3022kaptcha 简单例子 与 产生中文字符 kaptch ... -
myEclipse 下的项目不能编译
2010-09-09 14:21 948查看 是否有的错误的jar 1.项目----prope ... -
关于VLSM 例子
2010-08-31 16:57 1495未经测试,不知道理解是否正确。 VLSM(可变长子网掩码) ... -
jwebmail的配置
2010-08-16 16:59 2493jwebmail的配置说明 ... -
Solaris10下Nagios安装
2010-08-16 08:48 971发 -
java JDK 下载页面
2010-08-13 16:32 1008全部JDK 下载,从 1.1 到 jdk 6 下载 http ...
相关推荐
在Java编程中,处理文件压缩和解压是常见的任务,特别是使用ZIP格式。然而,当涉及到包含中文字符的文件或目录时,可能会遇到乱码问题。这个问题主要源于字符编码的不一致,通常需要正确设置字符集来确保中文字符在...
在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...
本篇文章将详细讲解ZIP压缩和解压类的相关知识,以及如何封装一个简单的ZIP文件处理接口。 一、ZIP文件格式基础 ZIP是一种流行的文件存档格式,它允许将多个文件和目录打包成一个单一的文件。ZIP文件内部包含了一个...
在Java编程中,处理压缩和解压缩ZIP文件是一项常见的任务,尤其当文件中包含中文字符时,可能会遇到中文乱码的问题。这是因为Java的标准库在处理非ASCII编码时可能存在不足。本篇文章将详细介绍如何使用Java标准库...
这里我们关注的是“文件解压和压缩”以及处理“中文乱码”的问题。在Java编程语言中,提供了多种库和工具来处理这些问题。 首先,`CompresszZipFile`是一个可能的自定义类或方法,它专门用于处理ZIP文件的解压。在...
本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 首先,我们要明白乱码问题的根源。在文件的压缩和解压缩过程中,文件名通常被编码为字节序列,这个序列取决于原始文件名...
《使用SharpCompress库处理ZIP和RAR文件及中文乱码问题》 在IT行业中,文件压缩和解压缩是一项常见的操作,特别是在数据传输和存储时。本文将深入探讨如何使用SharpCompress这一开源库来处理ZIP和RAR文件,并解决在...
在IT行业中,中文乱码...无论是7-Zip还是C#,都需要确保编码设置与压缩文件一致,这样才能确保中文文件名在解压过程中正确显示。同时,保持软件和库的更新也是非常重要的,因为开发者通常会在新版本中修复已知的问题。
这个问题在处理包含非ASCII字符(例如中文字符)的文件时经常出现,因为标准的ZIP库可能不支持Unicode编码,导致解压时中文文件名显示为乱码。 在C++中,标准库并不直接支持ZIP文件的操作,因此开发者通常需要借助...
总之,`ZipUtil`文件压缩工具类通过结合`ZipEntry`和`ZipOutputStream`,提供了一种高效且健壮的解决方案,尤其适合处理包含中文字符的文件和目录,确保在压缩和解压过程中不会出现乱码问题。这对于需要在Java应用...
jdk自带的ZipEntry类解压zip文件,中文文件会出现乱码,jar包是根据Apache的解压缩包进行改造的,也适合于Android使用
网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void main(String args[]) { new ZipUtil().unZip("E:\\...
在处理压缩文件,如ZIP或RAR格式时,中文文件名可能会出现乱码问题,这通常是由于编码不兼容或缺少正确设置编码导致的。中文字符在不同的操作系统或软件中可能使用不同的编码方式,如GBK、UTF-8等,不匹配就会产生...
项目中碰到问题.jdk zipEntry 压缩中文文件名乱码 上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项. 第二种 就是拿来主义,因为 开源项目 Ant 里已经有...
在日本经常使用zip或者lha格式的压缩包,在中文系统下解压时,如果压缩包里的文件是日语名,虽然能正常解压,但是解出的文件会变成乱码。这实际上是日语系统使用Shift-JIS编码,在中文系统下解压时按照GB编码显示...
这个库在.NET平台上提供了一套完整的API,使得开发者能够轻松地进行文件或数据的压缩与解压操作。针对标题和描述中提到的“中文乱码”问题,本文将详细讲解如何使用ICSharpCode.SharpZipLib解决这个问题,并提供相关...
* @param targetPath 解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下 * void */ public static void unzip(String zipFilePath, String targetPath) throws ...
当我们尝试用这些类解压含有中文名的文件时,如果未正确处理字符编码,就会出现乱码或者解压失败。 为了解决这个问题,我们需要确保在读取ZIP文件时正确地设置字符编码。以下是一些关键步骤: 1. **设置正确的字符...
然而,当我们在解压缩ZIP文件时,有时会遇到“乱码”的问题,这通常是由于编码不兼容或者设置不当导致的。本文将深入探讨ZIP解压缩乱码的解决方案,帮助你解决这个问题。 1. **理解字符编码** - 字符编码是计算机...
在IT行业中,文件压缩是一种常见的数据存储和传输方式,ZipOutputStream是Java标准库中的一个类,用于将数据流写入ZIP格式的压缩文件。本文将深入探讨如何使用ZipOutputStream进行文件压缩,并解决可能出现的乱码...