- 浏览: 779144 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
萨琳娜啊:
Java读源码之Netty深入剖析网盘地址:https://p ...
Netty源码学习-FileRegion -
飞天奔月:
写得有趣 ^_^
那一年你定义了一个接口 -
GoldRoger:
第二个方法很好
java-判断一个自然数是否是某个数的平方。当然不能使用开方运算 -
bylijinnan:
<script>alert("close ...
自己动手实现Java Validation -
paul920531:
39行有个bug:"int j=new Random ...
java-蓄水池抽样-要求从N个元素中随机的抽取k个元素,其中N无法确定
刚开始用java.util.Zip,发现不支持中文(网上有修改的方法,但比较麻烦)
后改用org.apache.tools.zip
org.apache.tools.zip的使用网上有更简单的例子
下面的程序根据实际需求,实现了压缩指定目录下指定文件的方法
后改用org.apache.tools.zip
org.apache.tools.zip的使用网上有更简单的例子
下面的程序根据实际需求,实现了压缩指定目录下指定文件的方法
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; 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; import common.Logger;//in jxl.jar (excel) public class ZipUtil { /** * zip操作帮助类 * bylijinnan */ final static Logger logger = Logger.getLogger(ZipUtil.class); /** * 打包指定目录下所有文件,包括子文件夹 * @param sourceFolder 要打包的文件目录 * @param outputFolder 生成的压缩文件存放的目录 * @param zipFileName 生成的压缩文件名 * @throws IOException */ public static void zipFolder(String sourceFolder, String outputFolder,String zipFileName, String encoding) throws IOException { if (isEmptyStr(sourceFolder) || isEmptyStr(outputFolder) || isEmptyStr(zipFileName)) { logger.error("invalid parameters."); return; } sourceFolder = formatFilePath(sourceFolder); outputFolder = formatFilePath(outputFolder); List<String> filelist = generateFileList(sourceFolder); zipFileList(filelist, sourceFolder, outputFolder, zipFileName, encoding); } /** * 打包指定的文件。要打包的文件在文件列表中指定 * @param filelist 要打包的文件列表,这些文件是绝对路径 * @param outputFullFileName 生成的压缩文件全名,目录+文件名 * @throws IOException */ public static void zipFileList(List<String> filelist, String sourceFolder, String outputFolder, String zipFileName, String encoding) throws IOException { if (filelist == null || filelist.isEmpty()) { logger.error("no files to be zip. filelist is null or empty."); return; } if (isEmptyStr(outputFolder) || isEmptyStr(zipFileName)) { logger.error("outputFolder and zipFileName are unspecified."); return; } sourceFolder = formatFilePath(sourceFolder); outputFolder = formatFilePath(outputFolder); if (isEmptyStr(encoding)) { encoding = "UTF-8"; } File outputDir = new File(outputFolder); if (!outputDir.exists()) { outputDir.mkdirs(); } byte[] buffer = new byte[1024]; String outputFullFileName = (outputFolder + "/" + zipFileName); FileOutputStream fos = new FileOutputStream(outputFullFileName); ZipOutputStream zos = new ZipOutputStream(fos); zos.setEncoding(encoding); logger.info("Output to Zip : " + outputFullFileName); for (String file : filelist) { if (isEmptyStr(file)) { continue; } logger.info("File Added : " + file); ZipEntry ze = new ZipEntry(file); //这里用的是相对路径 zos.putNextEntry(ze); FileInputStream in = new FileInputStream(sourceFolder + "/" + file); //这里是绝对路径 int len; while ((len = in.read(buffer)) > 0) { zos.write(buffer, 0, len); } in.close(); } zos.closeEntry(); // remember close it zos.close(); logger.info("Compress Done"); } /** * Traverse a directory and get all files(include the files in sub directory), add the file into fileList and return it. * * @param sourceFolder * file or directory * @return filelist */ public static List<String> generateFileList(String sourceFolder) { List<String> filelist = null; if (!isEmptyStr(sourceFolder)) { sourceFolder = formatFilePath(sourceFolder); filelist = new ArrayList<String>(); File node = new File(sourceFolder); generateFileListHelper(sourceFolder, node, filelist); } return filelist; } private static void generateFileListHelper(String sourceFolder, File node, List<String> filelist) { // add file only if (node.isFile()) { String absoluteFile = node.getAbsoluteFile().toString(); String filepath = generateZipEntry(sourceFolder, absoluteFile); filelist.add(filepath); } if (node.isDirectory()) { String[] subNote = node.list(); for (String filename : subNote) { File subFile = new File(node, filename); generateFileListHelper(sourceFolder, subFile, filelist); } } } /** * Format the file path for zip. * Delete the "SOURCE_FOLDER" directory info,e.g. * d:\ziptest\tmpty.txt --> tmpty.txt * d:\ziptest\sub\t.xls --> sub\t.xls * * @param file * file path * @return Formatted file path. */ private static String generateZipEntry(String sourceFolder, String file) { logger.debug("sourceFolder=" + sourceFolder); logger.debug("file=" + file); String formattedPath = file.substring(sourceFolder.length() + 1); formattedPath = formatFilePath(formattedPath); logger.debug("formattedPath=" + formattedPath); return formattedPath; } /** * 将文件路径中的分隔符转换成"/",并去掉最后的分隔符(如果有) * @param str 文件路径 * @return 格式化后的文件路径 */ public static String formatFilePath(String str) { if (str != null && str.length() !=0) { str = str .replaceAll("\\\\", "/"); } if (str.endsWith("/")) { str = str.substring(0, str.length()-1); } return str; } private static boolean isEmptyStr(String str) { return str == null || str.length() == 0; } /** * 解压zip文件,支持子文件夹和中文 * @param zipFileFullName .zip文件的完整名字,包括文件夹路径 * @param outputFolder 解压到指定的文件夹。完整路径,如果不指定或者为null,则默认解压到压缩文件所在的当前文件夹 * @param encoding 编码格式 */ @SuppressWarnings("rawtypes") public static void unzip(String zipFileFullName, String outputFolder, String encoding) { if (zipFileFullName == null || zipFileFullName.length() == 0) { return; } if (!zipFileFullName.endsWith(".zip")) { logger.error(zipFileFullName + " is not a zip file."); return; } //change file separator to "/" zipFileFullName = zipFileFullName.replaceAll("\\\\", "/"); //find outputFolder String inputFolder = zipFileFullName.replaceAll("/[^/]+\\.zip", ""); if (outputFolder == null || outputFolder.length() == 0) { outputFolder = inputFolder; } outputFolder = outputFolder.replaceAll("\\\\", "/"); File outputFolderFile = new File(outputFolder); if (!outputFolderFile.exists()) { outputFolderFile.mkdirs(); } try { ZipFile zip = new ZipFile(zipFileFullName, encoding); Enumeration zipFileEntries = zip.getEntries(); while (zipFileEntries.hasMoreElements()) { ZipEntry entry = (ZipEntry) zipFileEntries.nextElement(); String entryName = entry.getName(); logger.debug("Extracting,entryName=" + entryName); /*用本程序中ZipUtil.zipFolder或者ZipUtil.zipFileList生成的zip文件,如果有子文件夹,entry.getName()会直接得到文件而略过了子文件夹: * 程序生成,解压时输出: * Extracting,entryName=sub/subsub/test.txt * 压缩软件7-Zip生成,解压时输出: * Extracting,entryName=sub/subsub/ * Extracting,entryName=sub/subsub/test.txt * 因此要区别对待 */ int lastSlashPos = entryName.lastIndexOf("/"); if (lastSlashPos != -1 ){ String folderStr = outputFolder + "/" + entryName.substring(0, lastSlashPos); File folder = new File(folderStr); if (!folder.exists()) { folder.mkdirs(); } } if (!entryName.endsWith("/")) { //this entry is not a directory. File outFile = new File(outputFolder + "/" + entryName); FileOutputStream fos = new FileOutputStream(outFile); Writer bw = new BufferedWriter(new OutputStreamWriter(fos, encoding)); InputStream in = zip.getInputStream(entry); Reader reader = new InputStreamReader(in, encoding); BufferedReader br = new BufferedReader(reader); String line; while ((line = br.readLine()) != null) { bw.write(line); } bw.close(); } } } catch (Exception e) { logger.error("errors occur when decompressing."); e.printStackTrace(); } } public static void main(String[] argv) { String sourceFolder = "d:/ziptest"; String outputFolder = "d:/ziptest"; String outputFileName = "ziptest.zip"; try { zipFolder(sourceFolder, outputFolder, outputFileName, "GB2312"); } catch (IOException e) { e.printStackTrace(); } String zipFileFullName = "d:\\ziptest\\ziptest.zip"; unzip(zipFileFullName, "d:\\ziptest\\unzip", "GB2312"); } }
发表评论
-
自己动手实现Java Validation
2015-09-18 20:37 10085参数检查用得最多的是J ... -
BeanUtils.copyProperties使用笔记
2015-07-06 22:17 32569BeanUtils.copyProperties VS Pro ... -
Haproxy+Keepalived高可用双机单活
2015-01-06 17:37 6592我们的应用MyApp不支持集群,但要求双机单活(两台机器:ma ... -
返回null还是empty
2014-05-16 15:35 100第一个问题,函数是应当返回null还是长度为0的数组(或集合) ... -
返回null还是empty
2014-05-16 15:34 2276第一个问题,函数是应当返回null还是长度为0的数组(或集合) ... -
返回null还是empty
2014-05-16 15:34 152第一个问题,函数是应当返回null还是长度为0的数组(或集合) ... -
返回null还是empty
2014-05-16 15:34 114第一个问题,函数是应当返回null还是长度为0的数组(或集合) ... -
返回null还是empty
2014-05-16 15:33 100第一个问题,函数是应当返回null还是长度为0的数组(或集合) ... -
Spring源码学习-JdbcTemplate queryForObject
2014-05-09 19:45 2989JdbcTemplate中有两个可能会混淆的queryForO ... -
Spring源码学习-JdbcTemplate batchUpdate批量操作
2014-05-07 16:21 18755Spring JdbcTemplate的batch操作最后还是 ... -
Spring源码学习-PropertyPlaceholderHelper
2014-04-25 18:47 2597今天在看Spring 3.0.0.RELEASE的源码,发现P ... -
J2EE设计模式-Intercepting Filter
2013-11-27 16:56 1506Intercepting Filter类似于职责链模式 有两种 ... -
CAS实现单点登录(SSO)
2013-07-29 18:08 1448参考以下两篇文章,对原作者表示感谢: http://blog. ... -
《重构,改善现有代码的设计》第八章 Duplicate Observed Data
2012-12-04 20:34 1475import java.awt.Color; impor ...
相关推荐
import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream;...需要的jar包,压缩zip包和解压zip包,远程打包,文件批量下载、文件批量上传
import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; /** * * 类名: ZipUtil.java * 描述:压缩/解压缩zip包处理类 * 创建...
http://mirror.bjtu.edu.cn/apache//ant/source/apache-ant-1.8.2-src.zip 使用我自己包,直接放到WEB-INF\classes下解压即可, 在程序中加上 outf.setEncoding("gbk");即可 下面是我的多个文件压缩成一个的压缩...
java压缩中文处理使用org.apache.tools.zip已经打包成jar 只要放在LIB文件夹下,然后在JSP 或 JAVA 里引用即可。 <%@ page language="java" import="java.sql.*,java.io.*,org.apache.tools.zip.Zip" pageEncoding=...
java 程序编写文件压缩成zip 和解压zip文件
在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...
用java.util.zipoutputstream压缩会出现中文的文件名乱码的情况,且无法设置字符集,这个版本用org.apache.tools.zip.ZipOutputStream压缩,可以自定义字符集,解决中文的文件名乱码问题。
tools and ant jar, 用于压缩文件,解压文件的java工具类,使用方法有对应的博客。
在android开发中,有时候需要将文件打包成zip或将zip解压,如果直接用java.util.zip包下面的类会出现中文乱码,如果直接用org.apache.tools.zip(ant包中的压缩功能)会影响项目的编译时间; 故将ant包中文件瘦身,既...
2种压缩、解压的实现 1> j2se的zip压缩解压实现 2> 基于apache tools的压缩解压实现
TOMCAT6.0.20下载:apache-tomcat-6.0.20.zip直接解压。http://tomcat.apache.org/download-60.cgi Jdk安装目录下D:\toots\Java\jdk1.6.0_18\bin\msvcr71.dll复制到C:\WINDOWS\system32下 二、 安装过程 设置环境...
platform-tools_r14-linux.zip 10.4M 将platform-tools目录解压到sdk所在目录 官网 platform-tools_r14-macosx.zip 10.8M 官网 platform-tools_r14-windows.zip 10.6M 官网 假如你已经安装过android sdk,想单独...
详解java解压缩zip和rar的工具类使用教程直接上代码 package decompress; import java.io.File; import java.io.FileOutputStream; import org.apache.tools.ant.Project; import org.apache.tools.ant...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset ...• 多媒体支持 包括常见的音频、视频和...
从http://www.apache.org/dist/jakarta/tomcat-4/binaries/ 下载Tomcat软件,这里我们使用Tomcat 5.0.28,下载并默认安装。 在安装步骤Apeche Tomcat Setup:Java Virtual Machine path selection中选择步骤1中JDK...
而这些好处并不仅仅限于静态内容,PHP动态页面和其他动态生成的内容均可以通过使用Apache压缩模块压缩,加上其他的性能调整机制和相应的服务器端 缓存规则,这可以大大提高网站的性能。因此,对于部署在Linux服务器...