`
gybin
  • 浏览: 269267 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

支持中文ZIP解压,压缩

    博客分类:
  • Java
 
阅读更多
支持中文ZIP解压,压缩
写道
package com.dragon.android.pandaspace.util.code;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
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.GZIPOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
* Description: zip管理器
*
* @version 1.0.0
*/
public class ZipManager {

static final int BUFFER = 8192;

/**
* zip压缩功能测试. 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.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<File> 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和其它的一些属性
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();
}
zos.close();
} else {
throw new Exception("this folder isnot exist!");
}
}

/**
* zip压缩功能测试. 将指定文件压缩后存到一压缩文件中
*
* @param baseDir
* 所要压缩的文件名
* @param objFileName
* 压缩后的文件名
* @return 压缩后文件的大小
* @throws Exception
*/
public static long createFileToZip(String zipFilename, String sourceFileName) 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();
}

/**
* zip压缩功能测试. 将指定文件压缩后存到一压缩文件中
*
* @param baseDir
* 所要压缩的文件名
* @param objFileName
* 压缩后的文件名
* @return 压缩后文件的大小
* @throws Exception
*/
public static long createFileToZip(File sourceFile, File zipFile) throws IOException {

byte[] buf = new byte[1024];

// 压缩文件名
File objFile = zipFile;

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
* @param outFileName
* @param suffix 只解压 后缀为suffix文件
* @throws IOException
*/
public static void releaseZipToFile(String sourceZip, String outFileName,String suffix) throws IOException {
ZipFile zfile = new ZipFile(sourceZip);
Enumeration zList = zfile.entries();
ZipEntry ze = null;
byte[] buf = new byte[1024 * 8];
while (zList.hasMoreElements()) {
// 从ZipFile中得到一个ZipEntry
ze = (ZipEntry) zList.nextElement();
if (ze.isDirectory()) {
continue;
}
if(suffix!=null){
String name=ze.getName();
if(!name.endsWith(suffix)){
continue;
}
}
// 以ZipEntry为参数得到一个InputStream,并写到OutputStream中
OutputStream os = null;
os = new BufferedOutputStream(new FileOutputStream(getRealFileName(outFileName, ze.getName())));
InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
int readLen = 0;
while ((readLen = is.read(buf, 0, 1024 * 8)) != -1) {
os.write(buf, 0, readLen);
}
is.close();
os.close();
// //Log.i("ZipManager", "[releaseZipToFile]"+"Extracted: " +
// ze.getName());
}
zfile.close();
}

public static void releaseZipToFile(String sourceZip, String outFileName) throws IOException {
releaseZipToFile(sourceZip,outFileName,null);
}

public static File releaseFileFromZip(String sourceZip,String outFilePath,String fileName) throws IOException{
byte[] buf = new byte[1024 * 8];
ZipFile zfile = new ZipFile(sourceZip);
ZipEntry ze=zfile.getEntry(fileName);
File destFile = null;
if(ze!=null){
OutputStream os = null;
destFile = getRealFileName(outFilePath, ze.getName());
os = new BufferedOutputStream(new FileOutputStream(destFile));
InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
int readLen = 0;
while ((readLen = is.read(buf, 0, 1024 * 8)) != -1) {
os.write(buf, 0, readLen);
}
is.close();
os.close();
}
zfile.close();
return destFile;
}

public static void releaseFileFromZip(String sourceZip, String sourceEntryName, String destDir, String destFileName) throws IOException{
byte[] buf = new byte[1024 * 8];
ZipFile zfile = new ZipFile(sourceZip);
ZipEntry ze=zfile.getEntry(sourceEntryName);
if(ze!=null){//文件的情况
OutputStream os = null;
InputStream is = null;
try {
os = new BufferedOutputStream(new FileOutputStream(getRealFileName(destDir, destFileName)));
is = new BufferedInputStream(zfile.getInputStream(ze));
int readLen = 0;
while ((readLen = is.read(buf, 0, 1024 * 8)) != -1) {
os.write(buf, 0, readLen);
}
} finally {
if(is != null) {
is.close();
is = null;
}
if(os != null) {
os.close();
os = null;
}

}
} else {//有文件夹的情况
Enumeration<ZipEntry> n = (Enumeration<ZipEntry>) zfile.entries();
while(n.hasMoreElements()) {
ZipEntry zipFile = n.nextElement();
if(zipFile!=null){
String entryname = zipFile.getName();
if(entryname.startsWith(sourceEntryName)) {
String endPath = entryname.substring(sourceEntryName.length());
if(endPath.endsWith("/")) {//文件夹
File file = new File(destDir + destFileName + endPath);
if(!file.exists()) {
file.mkdirs();
}
} else {//文件
OutputStream os = null;
InputStream is = null;
try {
os = new BufferedOutputStream(new FileOutputStream(getRealFileName(destDir + destFileName, endPath)));
is = new BufferedInputStream(zfile.getInputStream(zipFile));
int readLen = 0;
while ((readLen = is.read(buf, 0, 1024 * 8)) != -1) {
os.write(buf, 0, readLen);
}
} finally {
if(is != null) {
is.close();
is = null;
}
if(os != null) {
os.close();
os = null;
}

}
}
}
}
}
}
zfile.close();
}
/**
* 解压ZIP包, 保留目录结构。
* @throws IOException
*/
public static ArrayList<Object> ectract(String sZipPathFile, String sDestPath, boolean autoRename,boolean isStop) throws IOException {
ArrayList<Object> allFileName = new ArrayList<Object>();
// 先指定压缩档的位置和档名,建立FileInputStream对象
FileInputStream fins = new FileInputStream(sZipPathFile);
// 将fins传入ZipInputStream中
ZipInputStream zins = new ZipInputStream(fins);
ZipEntry ze = null;
byte ch[] = new byte[BUFFER];
while ((ze = zins.getNextEntry()) != null) {
if (isStop) {
return null;
}
String name = ze.getName();
name = name.replace('\\', '/');
name = name.replaceAll("\\s", "%20");
File zfile = new File(sDestPath + name);
File fpath = new File(zfile.getParentFile().getPath());
if (ze.isDirectory()) {
if (!zfile.exists())
zfile.mkdirs();
zins.closeEntry();
} else {
if (!fpath.exists())
fpath.mkdirs();
FileOutputStream fouts = new FileOutputStream(zfile);
int i;
allFileName.add(zfile.getAbsolutePath());
while ((i = zins.read(ch,0,BUFFER)) != -1)
fouts.write(ch, 0, i);
zins.closeEntry();
fouts.close();
}
}
fins.close();
zins.close();
return allFileName;
}
// /**
// * 测试解压缩功能. 将d:\\download\\test.zip连同子目录解压到d:\\temp\\zipout目录下.
// *
// * @throws Exception
// */
// @SuppressWarnings("unchecked")
// public static void releaseDecodeZipToFile(String sourceZip, String
// outFileName, String password) throws Exception {
// SecretKeySpec dks = new SecretKeySpec(password.getBytes(), "AES");
// SecureRandom sr = new SecureRandom();
// Cipher ciphers = Cipher.getInstance("AES/CBC/PKCS5Padding");
// IvParameterSpec spec = new IvParameterSpec(dks.getEncoded());
// ciphers.init(Cipher.DECRYPT_MODE, dks, spec, sr);
//
// ZipFile zfile = new ZipFile(sourceZip);
// System.out.println(zfile.getName());
// Enumeration zList = zfile.entries();
// ZipEntry ze = null;
// byte[] buf = new byte[1024 * 8];
// while (zList.hasMoreElements()) {
// // 从ZipFile中得到一个ZipEntry
// ze = (ZipEntry) zList.nextElement();
// if (ze.isDirectory()) {
// continue;
// }
// // 以ZipEntry为参数得到一个InputStream,并写到OutputStream中
// OutputStream os = new BufferedOutputStream(new
// FileOutputStream(getRealFileName(outFileName, ze.getName())));
// InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
// int readLen = 0;
// while ((readLen = is.read(buf, 0, 1024 * 8)) != -1) {
// os.write(ciphers.doFinal(buf), 0, readLen);
// }
// is.close();
// os.close();
// // //Log.i("ZipManager", "[releaseZipToFile]"+"Extracted: " +
// // ze.getName());
// }
// zfile.close();
// }

/**
* 取得指定目录下的所有文件列表,包括子目录.
*
* @param baseDir
* File 指定的目录
* @return 包含java.io.File的List
*/
public static List<File> getSubFiles(File baseDir) {
List<File> ret = new ArrayList<File>();
// File base=new File(baseDir);
File[] tmp = baseDir.listFiles();
for (int i = 0; i < tmp.length; i++) {
if (tmp[i].isFile()) {
ret.add(tmp[i]);
}
if (tmp[i].isDirectory()) {
ret.addAll(getSubFiles(tmp[i]));
}
}
return ret;
}

/**
* 给定根目录,返回一个相对路径所对应的实际文件名.
*
* @param baseDir
* 指定根目录
* @param absFileName
* 相对路径名,来自于ZipEntry中的name
* @return java.io.File 实际的文件
* @throws IOException
*/
private static File getRealFileName(String baseDir, String absFileName) throws IOException {
String[] dirs = absFileName.split("/");
// System.out.println(dirs.length);
File ret = new File(baseDir);
// System.out.println(ret);
if (dirs.length > 1) {
for (int i = 0; i < dirs.length - 1; i++) {
ret = new File(ret, dirs[i]);
}
}
if (!ret.exists()) {
ret.mkdirs();
}
String parentPath = ret.getAbsolutePath();
ret = new File(ret, new String(dirs[dirs.length - 1].getBytes()));
if (!ret.exists()) {
try {
ret.createNewFile();
} catch (Exception e) {
String fileName = new String(dirs[dirs.length - 1].getBytes());
int idx = fileName.lastIndexOf(".");
String ext = "";
if (idx >= 0) {
ext = fileName.substring(idx);
}
ret = new File(parentPath, "" + System.currentTimeMillis() + ext);
ret.createNewFile();
}
}
return ret;
}

/**
* 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
*
* @param baseDir
* java.lang.String 根目录
* @param realFileName
* java.io.File 实际的文件名
* @return 相对文件名
*/
public 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;
}

@SuppressWarnings("unchecked")
public void testReadZip(String zipPath, String outPath) throws Exception {
ZipFile zfile = new ZipFile(zipPath);
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中
OutputStream os = new BufferedOutputStream(new FileOutputStream(getRealFileName(outPath, ze.getName())));
InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
int readLen = 0;
while ((readLen = is.read(buf, 0, 1024)) != -1) {
os.write(buf, 0, readLen);
}
is.close();
os.close();
//Log.i("ZipManager", "[testReadZip]" + "Extracted: " + ze.getName());
}
zfile.close();
}

public static byte[] convertStringtoGzip(List<String> contents) {
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
GZIPOutputStream gop = null;
try {
gop = new GZIPOutputStream(arrayOutputStream);
for (String content : contents) {
byte[] contentByte = content.getBytes();
// //Log.i("SPACE", content);
gop.write(contentByte, 0, contentByte.length);
}
gop.finish();
} catch (Exception e) {
return null;
} finally {
try {
gop.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return arrayOutputStream.toByteArray();
}

@SuppressWarnings("static-access")
public static void main(String args[]) {
// ZipManager manager = new ZipManager();
// try {
// //manager.unZip("c:\\testNpk.npk", "c:\\test");
// } catch (Exception e) {
// }
// System.out.println("over");
}

}

 

分享到:
评论

相关推荐

    C++ Zlib库实现zip文件压缩解压(支持递归压缩)

    本篇文章将详细介绍如何在`C++`中利用`Zlib`库实现对`zip`文件的压缩和解压,并特别关注其支持的递归压缩特性,以及如何将其与自动更新功能结合使用。 首先,我们需要理解`Zlib`库的基本原理。`Zlib`库基于`DEFLATE...

    ZIP压缩和解压类

    三、ZIP解压过程 1. 读取ZIP头:解压程序首先读取ZIP文件的头信息,了解文件的结构。 2. 分析ZIP目录:解析ZIP文件中的中央目录,获取所有文件的压缩数据位置和元数据。 3. 解压缩数据:根据目录信息,逐个读取并解...

    C语言实现Zip压缩解压.rar

    2. **选择压缩方法**:ZIP支持多种压缩方法,如DEFLATE(最常用)、STORE(不压缩)等。DEFLATE使用LZ77压缩算法,可以实现较高的压缩比。 3. **压缩数据**:使用选择的压缩方法对文件内容进行处理,生成压缩后的...

    支持中文的zip压缩解压

    "支持中文的zip压缩解压"这个话题对于处理包含中文文件名或路径的文件集合尤其重要。在许多编程语言中,包括Java,处理中文字符可能会遇到编码问题,导致在压缩或解压缩过程中出现乱码。以下是对这一主题的详细解释...

    C++ zip解压缩压缩

    本文将详细介绍一个基于C++的zip文件处理方法,它允许开发者通过仅包含几个头文件就能实现文件的压缩和解压缩功能。这个解决方案简洁易用,非常适合那些需要在C++项目中集成压缩功能的开发者。 标题中的"C++ zip解...

    vbs压缩和解压zip,vbs压缩zip,vbs解压zip

    Visual Basic Script(VBS)作为Windows环境中的一种常用脚本语言,支持多种文件操作功能,包括ZIP文件的压缩和解压缩。 #### 一、基础知识简介 在开始之前,我们需要了解几个基本概念: 1. **Shell.Application ...

    zip文件压缩解压源码 (c++)

    总结来说,`zip文件压缩解压源码(C++)`涉及的关键技术包括:理解zip文件格式,使用C++进行文件操作,选择和应用压缩算法,以及错误处理。通过分析和理解`XUnzip.cpp`和`XZip.cpp`,我们可以学习如何在C++环境中...

    VB6.0调用 DLL版ZIP压缩文件夹目录和解压ZIP文件

    VB6.0调用 DLL版ZIP压缩文件夹目录和解压ZIP文件,网上很多源码不好用,所以就自己做了一个。原始代码是VC++的用VS2019编译了一个,DLL封装了下。调用很简单 '调用方法如下: 'CreateZipFileA "C:\123", "C:\123.zip...

    C语言zip解压缩算法源代码

    在实际应用中,为了实现完整的zip解压缩功能,你需要补充CRC校验代码,并考虑添加对`STORED`和`FIXED`压缩方式的支持。同时,考虑到效率和兼容性,可能还需要实现多线程解压,或者使用库如zlib来简化这一过程。 总...

    易语言zip解压

    在易语言中,实现ZIP解压功能通常需要调用系统API或者第三方库。由于易语言本身并不直接支持ZIP操作,我们需要找到合适的库函数或组件来辅助。例如,可以使用WinAPI中的`CreateFile`、`ReadFile`、`FindFirstFile`等...

    C# Ionic.Zip.dll以及 解压压缩帮助文档

    对于解压缩,可以使用`ZipFile.Read`静态方法打开ZIP文件,然后遍历`Entries`集合,对每个条目调用`Extract`方法来解压到指定的目录: ```csharp using Ionic.Zip; ZipFile zip = ZipFile.Read("archive.zip"); ...

    VC++压缩解压zip文件(支持密码)

    只能压缩解压zip格式的,不需要dll或者库文件,核心是HZIP,支持带密码压缩解压。详情参见: http://blog.csdn.net/sunflover454/article/details/48981841

    解压jar,zip,压缩支持中文zip

    本文将详细讨论如何解压`jar`和`zip`格式的文件,特别是针对支持中文文件名的情况。`jar`文件主要用于Java应用程序,而`zip`文件则是一种通用的压缩格式,广泛应用于各种操作系统。 首先,让我们了解`jar`文件。`...

    java zip压缩解压工具解决中文乱码问题

    以上代码片段展示了如何利用Apache Commons IO库来处理中文乱码问题,使得在Java中进行ZIP文件的压缩和解压更加便捷和准确。在实际开发中,根据项目需求,可以选择使用标准库或者Apache Commons IO库,确保文件名和...

    VC++关于ZIP压缩解压压缩(支持带密码并修复带密码解压的Bug)

    这里只提供4个文件,zip.h,zip.cpp,unzip.h,unzip.cpp。 在VC6.0中,LONGLONG的报错,并修复了HZIP解压带有密码的压缩包,少了12个字节的错误。具体例子在头文件里有。 可以参考文章:...

    java android zip解压缩(解决压缩中文乱码问题)

    本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 首先,我们要明白乱码问题的根源。在文件的压缩和解压缩过程中,文件名通常被编码为字节序列,这个序列取决于原始文件名...

    zip格式压缩和解压

    【标题】:ZIP格式压缩与解压 ZIP是一种常见的文件压缩格式,广泛应用于数据存储、文件传输和软件分发等领域。ZIP文件可以将多个文件和文件夹打包成一个单一的可压缩文件,节省磁盘空间,提高传输效率。在Windows、...

    最新版7zip解压压缩工具

    7-Zip是一款非常流行的开源压缩和解压缩工具,其最新版本以其高效、免费以及支持多种压缩格式的特点,深受广大用户喜爱。7-Zip不仅能够处理常见的ZIP和RAR格式,还特别支持其自身独特的7Z格式,该格式在压缩比率和...

    java 操作Zip文件(压缩、解压、加密).zip

    Java操作Zip文件主要涉及到对文件和目录的压缩与解压缩,以及在必要时对压缩文件进行加密处理。这里我们重点讨论使用两个库:`zip4j`和`Apache Ant`来实现这些功能。 1. **zip4j库**:`zip4j-1.3.2.jar`是一个用...

    QT5 zip压缩和解压源代码

    QT5不仅支持ZIP格式,还可以处理其他压缩格式如TAR、GZIP等,只需更换相应的读写器类即可。 10. **最佳实践** 为了保持代码的可维护性和灵活性,建议封装压缩和解压缩功能为独立的函数或类,以便在不同项目中复用...

Global site tag (gtag.js) - Google Analytics