java 实现压缩与解压缩ZIP
java zipfile原理
java zipfile原理Java ZipFile是一种用于处理ZIP文件的类,它提供了对ZIP文件进行读取、写入和创建的功能。
Zip是一种常见的文件压缩格式,它可以将多个文件和目录压缩成一个单独的文件,方便数据的传输和存储。
Java ZipFile类是Java标准库中的一部分,它提供了一种简单易用的方式来操作ZIP文件。
Java ZipFile类是java.util.zip包中的一个类,它提供了对ZIP文件进行操作的方法,如打开ZIP文件、读取文件、写入文件等。
ZipFile类中的方法可以直接访问ZIP文件中的内容,而不需要手动进行解压缩操作。
使用ZipFile类可以方便地实现对ZIP文件中的文件进行读取、修改和删除等操作。
Java ZipFile类的工作原理主要基于Java的压缩API(java.util.zip)和Java IO API。
当使用ZipFile类打开一个ZIP文件时,它会创建一个ZipInputStream对象,该对象负责读取ZIP文件中的内容。
ZipInputStream对象会按照ZIP文件中的文件列表逐个读取文件,并将其内容传递给相应的输入流(如InputStream)。
用户可以通过这些输入流来读取ZIP文件中的文件内容。
在读取ZIP文件的过程中,ZipFile类还会对ZIP文件进行一些必要的处理,如检查ZIP文件的签名、解析ZIP文件的目录结构等。
这些处理可以帮助确保ZIP文件的完整性,并避免一些常见的错误和异常。
Java ZipFile类提供了多种方法来操作ZIP文件,包括打开ZIP文件、读取文件、写入文件等。
以下是一些常用的方法:1. open()方法:打开一个ZIP文件,返回一个ZipInputStream对象,该对象可以用于读取ZIP文件中的内容。
2. getInputStream()方法:从ZIP文件中读取一个文件的内容,返回一个InputStream对象。
Java解压ZIP文件的简单操作
}
entries.add(entry);
}
unzip(zipFile, entries, outputDirectory);
}
public static void unzip(ZipFile zipFile, List<ZipEntry> entries,
MultiThreadEntry mte = new MultiThreadEntry(zipFile, zipEntry,
outputDirectory);
Thread thread = new Thread(mte);
thread.start();
}
}
e1.printStackTrace();
}
} finally {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void unzipFiles(ZipEntry zipEntry, String outputDirectory)
/*
* Use MultiThread to read each entry
*/
private static class MultiThreadEntry implements Runnable {
public static final int BUFFER_SIZE = 2048;
*/
public ZipUtils() {
}
public static void unZipDirectory(String zipFileDirectory,
JavaZIP压缩和解压缩文件(解决中文文件名乱码问题)
JavaZIP压缩和解压缩⽂件(解决中⽂⽂件名乱码问题)JDK中⾃带的ZipOutputStream在压缩⽂件时,如果⽂件名中有中⽂,则压缩后的zip⽂件打开时发现中⽂⽂件名变成乱码.解决的⽅法是使⽤apache-ant-zip.jar包(见附件)中的ZipOutputStream和ZipEntry.即,导⼊类:import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipOutputStream;并且注意,压缩之前调⽤ZipOutputStream的out.setEncoding(System.getProperty("sun.jnu.encoding"));⽅法,系统参数sun.jnu.encoding表⽰获取当前系统中的⽂件名的编码⽅式.这⾥将ZipOutputStream的⽂件名编码⽅式设置成系统的⽂件名编码⽅式.解压时,直接使⽤JDK原来的ZipInputStream即可.但是有个需要注意的地⽅是,在读取ZIP⽂件之前,需要设置:System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding"));将系统的ZIP编码格式设置为系统⽂件名编码⽅式,否则解压时报异常.import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;改为import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipOutputStream;ant包⾥提供ZipOutputStream类的setEncoding("gbk")⽅法。
zos.setEncoding("gbk");。
java 常用字符串压缩算法
java 常用字符串压缩算法
在Java中,常见的字符串压缩算法包括:
1. Huffman编码:这是一种基于字符频率的压缩算法。
它通过创建一个特殊的编码树(Huffman Tree),使得出现频率高的字符使用较短的编码,出现频率低的字符使用较长的编码,从而达到压缩的效果。
2. LZ77:这是另一种常用的字符串压缩算法。
它通过查找并记录字符串中的重复子串,用较短的引用代替这些重复子串,从而达到压缩的效果。
3. LZ78:这是LZ77的扩展,通过使用字典的方式,使得压缩和解压缩的过程更加高效。
4. Deflate:这是Zlib和Gzip等压缩算法的基础。
它结合了LZ77和Huffman编码,同时实现了高效的压缩和解压缩。
5. Brotli:这是一种现代的通用无损数据压缩算法,由Google开发。
它的压缩比比Deflate更高,但解压缩速度更快。
在Java中,这些算法可以通过第三方库实现,例如`java-compression`和`lz4-java`等。
如果你需要使用这些算法,你可能需要查看这些库的文档来了解如何使用它们。
利用java实现zip的压缩和解压
menuitem neww= new menuitem("new");
neww.addactionlistener(this);
file.add(neww);
menuitem open=new menuitem("open");
open.addactionlistener(this);
dispose();∥关闭窗口
system.exit(0);∥关闭程序
}
else {
system.out.println("no this command!");
}
}
}
if ("new".equals(arg)) randomdata();
else if ("open".equals(arg)) openfile();
else if ("save".equals(arg)) savefile();
else if ("exit".equals(arg)){
∥用zip输入流构建datainputstream
doc=dis.readutf();∥读取文件内容
dis.close();∥关闭文件
doczipsize = f.length();∥获取zip文件长度
showtextandinfo();∥显示数据
exit.addactionlistener(this);
file.add(exit);
∥随机生成的数据文件的多行文本显示域
add("center",textarea = new textarea());
java 压缩数据方法
java 压缩数据方法Java是一种广泛应用于开发各种应用程序的编程语言,它提供了丰富的库和工具来满足不同的需求。
其中,压缩数据是一项常见的需求,本文将介绍一些Java中常用的压缩数据方法。
1. GZIP压缩GZIP是一种常用的数据压缩算法,它可以将数据以流的形式进行压缩和解压缩。
在Java中,可以使用java.util.zip包中的GZIPOutputStream和GZIPInputStream来实现数据的压缩和解压缩。
下面是一个示例代码:```javapublic static byte[] compress(byte[] data) throws IOException {ByteArrayOutputStream bos = new ByteArrayOutputStream();GZIPOutputStream gzip = new GZIPOutputStream(bos);gzip.write(data);gzip.close();return bos.toByteArray();}public static byte[] decompress(byte[] compressedData)throws IOException {ByteArrayInputStream bis = new ByteArrayInputStream(compressedData);GZIPInputStream gzip = new GZIPInputStream(bis);byte[] buffer = new byte[1024];ByteArrayOutputStream bos = new ByteArrayOutputStream();int len;while ((len = gzip.read(buffer)) != -1) {bos.write(buffer, 0, len);}gzip.close();return bos.toByteArray();}```上述代码中,compress方法接受一个字节数组作为输入,返回压缩后的字节数组。
Java解压和压缩带密码的zip文件过程详解
Java解压和压缩带密码的zip⽂件过程详解前⾔JDK⾃带的ZIP操作接⼝(java.util.zip包,请参看⽂章末尾的博客链接)并不⽀持密码,甚⾄也不⽀持中⽂⽂件名。
为了解决ZIP压缩⽂件的密码问题,在⽹上搜索良久,终于找到了winzipaes开源项⽬。
该项⽬在下托管,仅⽀持AES压缩和解压zip⽂件( This library only supports Win-Zip's 256-Bit AES mode.)。
⽹站上下载的⽂件是源代码,最新版本为winzipaes_src_20120416.zip,本⽰例就是在此基础上编写。
详述项⽬使⽤很简单,利⽤源码⾃⼰导出⼀个jar⽂件,在项⽬中引⽤即可。
这⾥有⼀个需要注意的问题,就是如果给定ZIP⽂件没有密码,那么就不能使⽤该项⽬解压,如果压缩⽂件没有密码却使⽤该项⽬解压在这⾥会报⼀个异常,所以使⽤中需要注意:加密ZIP⽂件可以使⽤它解压,没有加密的就需要采取其它⽅式了。
此⽂就是采⽤修改后的winzipaes编写,并记录详细修改步骤。
⽰例在研究该项⽬时写了⼀个⼯具类,本来准备⽤在项⽬中,最后找到了更好的解决⽅案zip4j来代替,所以最终没有采⽤。
package com.ninemax.demo.zip.decrypt;import java.io.File;import java.io.IOException;import java.util.List;import java.util.zip.DataFormatException;import mons.io.FileUtils;import de.idyl.winzipaes.AesZipFileDecrypter;import de.idyl.winzipaes.AesZipFileEncrypter;import de.idyl.winzipaes.impl.AESDecrypter;import de.idyl.winzipaes.impl.AESDecrypterBC;import de.idyl.winzipaes.impl.AESEncrypter;import de.idyl.winzipaes.impl.AESEncrypterBC;import de.idyl.winzipaes.impl.ExtZipEntry;/*** 压缩指定⽂件或⽬录为ZIP格式压缩⽂件* ⽀持中⽂(修改源码后)* ⽀持密码(仅⽀持256bit的AES加密解密)* 依赖bcprov项⽬(bcprov-jdk16-140.jar)** @author zyh*/public class DecryptionZipUtil {/*** 使⽤指定密码将给定⽂件或⽂件夹压缩成指定的输出ZIP⽂件* @param srcFile 需要压缩的⽂件或⽂件夹* @param destPath 输出路径* @param passwd 压缩⽂件使⽤的密码*/public static void zip(String srcFile,String destPath,String passwd) {AESEncrypter encrypter = new AESEncrypterBC();AesZipFileEncrypter zipFileEncrypter = null;try {zipFileEncrypter = new AesZipFileEncrypter(destPath, encrypter);/*** 此⽅法是修改源码后添加,⽤以⽀持中⽂⽂件名*/zipFileEncrypter.setEncoding("utf8");File sFile = new File(srcFile);/*** AesZipFileEncrypter提供了重载的添加Entry的⽅法,其中:* add(File f, String passwd)* ⽅法是将⽂件直接添加进压缩⽂件** add(File f, String pathForEntry, String passwd)* ⽅法是按指定路径将⽂件添加进压缩⽂件* pathForEntry - to be used for addition of the file (path within zip file)*/doZip(sFile, zipFileEncrypter, "", passwd);} catch (IOException e) {e.printStackTrace();} finally {try {zipFileEncrypter.close();} catch (IOException e) {e.printStackTrace();}}}/*** 具体压缩⽅法,将给定⽂件添加进压缩⽂件中,并处理压缩⽂件中的路径* @param file 给定磁盘⽂件(是⽂件直接添加,是⽬录递归调⽤添加)* @param encrypter AesZipFileEncrypter实例,⽤于输出加密ZIP⽂件* @param pathForEntry ZIP⽂件中的路径* @param passwd 压缩密码* @throws IOException*/private static void doZip(File file, AesZipFileEncrypter encrypter,String pathForEntry, String passwd) throws IOException {if (file.isFile()) {pathForEntry += file.getName();encrypter.add(file, pathForEntry, passwd);return;}pathForEntry += file.getName() + File.separator;for(File subFile : file.listFiles()) {doZip(subFile, encrypter, pathForEntry, passwd);}}/*** 使⽤给定密码解压指定压缩⽂件到指定⽬录* @param inFile 指定Zip⽂件* @param outDir 解压⽬录* @param passwd 解压密码*/public static void unzip(String inFile, String outDir, String passwd) {File outDirectory = new File(outDir);if (!outDirectory.exists()) {outDirectory.mkdir();}AESDecrypter decrypter = new AESDecrypterBC();AesZipFileDecrypter zipDecrypter = null;try {zipDecrypter = new AesZipFileDecrypter(new File(inFile), decrypter);AesZipFileDecrypter.charset = "utf-8";/*** 得到ZIP⽂件中所有Entry,但此处好像与JDK⾥不同,⽬录不视为Entry* 需要创建⽂件夹,entry.isDirectory()⽅法同样不适⽤,不知道是不是⾃⼰使⽤错误 * 处理⽂件夹问题处理可能不太好*/List<ExtZipEntry> entryList = zipDecrypter.getEntryList();for(ExtZipEntry entry : entryList) {String eName = entry.getName();String dir = eName.substring(0, stIndexOf(File.separator) + 1);File extractDir = new File(outDir, dir);if (!extractDir.exists()) {FileUtils.forceMkdir(extractDir);}/*** 抽出⽂件*/File extractFile = new File(outDir + File.separator + eName);zipDecrypter.extractEntry(entry, extractFile, passwd);}} catch (IOException e) {e.printStackTrace();} catch (DataFormatException e) {e.printStackTrace();} finally {try {zipDecrypter.close();} catch (IOException e) {e.printStackTrace();}}}/*** 测试* @param args*/public static void main(String[] args) {/*** 压缩测试* 可以传⽂件或者⽬录*/// zip("M:\\ZIP\\test\\bb\\a\\t.txt", "M:\\ZIP\\test\\temp1.zip", "zyh");// zip("M:\\ZIP\\test\\bb", "M:\\ZIP\\test\\temp2.zip", "zyh");unzip("M:\\ZIP\\test\\temp2.zip", "M:\\ZIP\\test\\temp", "zyh");}}压缩多个⽂件时,有两个⽅法(第⼀种没试):(1)预先把多个⽂件压缩成zip,然后调⽤enc.addAll(inZipFile, password);⽅法将多个zip⽂件加进来。
java压缩数据方法
java压缩数据方法Java是一种强大的编程语言,为了更好地节省空间和方便文件传输,Java提供了一些压缩数据的方法。
一、Zip压缩Zip压缩是Java中最常用的压缩方法,它主要使用java.util.zip包下的ZipOutputStream和ZipEntry类。
ZipOutputStream可以将文件压缩成Zip文件,而ZipEntry则代表ZipFile中的每一个文件。
Zip压缩的步骤如下:1. 创建ZipOutputStream对象,并指定输出的Zip文件名。
2. 遍历需要压缩的文件路径,使用FileInputStream的方式读取文件。
3. 创建ZipEntry对象并设置Entry名称。
4. 将ZipEntry对象写入ZipOutputStream中。
5. 将需要压缩的文件写入到ZipOutputStream中。
6. 关闭ZipOutputStream和FileInputStream对象。
二、Gzip压缩除了Zip压缩,Java还提供了Gzip压缩方法,它可以让数据更好地适配网络传输。
Gzip压缩主要使用java.util.zip包下的GZIPOutputStream和GZIPInputStream类。
Gzip压缩的步骤如下:1. 创建GZIPOutputStream对象,该对象用于压缩数据。
2. 写入需要压缩的数据。
3. 结束压缩并关闭流。
4. 创建GZIPInputStream对象,该对象用于解压缩数据。
5. 将需要解压缩的数据传入GZIPInputStream对象。
6. 读取解压缩后的数据。
7. 关闭GZIPInputStream对象。
三、Deflate压缩类似于Gzip压缩,Java还提供了Deflate压缩方法。
Deflate压缩主要使用java.util.zip包下的Deflater和Inflater类。
Deflate压缩的步骤如下:1. 创建Deflater对象,该对象用于压缩数据。
Java中的文件压缩与解压缩方法
Java中的文件压缩与解压缩方法在日常的开发工作中,文件的压缩与解压缩是一个常见的需求。
Java作为一种广泛使用的编程语言,提供了丰富的类库和方法来实现这一功能。
本文将介绍Java中常用的文件压缩与解压缩方法,并探讨它们的优缺点以及适用场景。
一、文件压缩方法1. Zip压缩Zip是一种常见的文件压缩格式,Java提供了java.util.zip包来实现对Zip文件的压缩和解压缩操作。
使用Zip压缩文件可以将多个文件或文件夹打包成一个压缩文件,方便传输和存储。
在Java中,可以使用ZipOutputStream类来创建一个Zip文件,并使用ZipEntry类来表示Zip文件中的每个文件或文件夹。
下面是一个简单的示例代码:```javaimport java.io.*;import java.util.zip.*;public class ZipUtil {public static void zipFile(String sourceFilePath, String zipFilePath) {try {FileOutputStream fos = new FileOutputStream(zipFilePath);ZipOutputStream zos = new ZipOutputStream(fos);File file = new File(sourceFilePath);zipFile(file, file.getName(), zos);zos.close();fos.close();} catch (IOException e) {e.printStackTrace();}}private static void zipFile(File file, String fileName, ZipOutputStream zos) throws IOException {if (file.isDirectory()) {File[] files = file.listFiles();for (File f : files) {zipFile(f, fileName + "/" + f.getName(), zos);}} else {FileInputStream fis = new FileInputStream(file);ZipEntry zipEntry = new ZipEntry(fileName);zos.putNextEntry(zipEntry);byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer)) > 0) {zos.write(buffer, 0, len);}fis.close();}}}```上述代码中,zipFile方法用于递归压缩文件夹中的所有文件和子文件夹。
java压缩文件解压:调用WinRAR5命令强于自己写代码实现
java压缩⽂件解压:调⽤WinRAR5命令强于⾃⼰写代码实现最近,⼿上维护着⼀个⼏年前的系统,技术是⽤的JSP+Strust2,系统提供了rar和zip两种压缩格式的解压功能,后台是⽤java实现的1、解压rar格式,采⽤的是java-unrar-0.3.jar2、解压zip格式,采⽤的是commons-compress-1.4.1.jar但最近根据⽤户反馈的问题,发现系统存在两个关于压缩⽂件解压的问题:1、有些压缩⽂件解压之后出现中⽂乱码;2、有些压缩⽂件根本不能解压为了弥补上述两个问题,在之前代码的基础上打了⼀些补丁,来解决zip压缩包乱码的问题,思路⼤概是:1、采⽤GBK编码解压2、递归遍历解压的⽂件名是否存在中⽂乱码,这⽤到了⽹上很常⽤的中⽂检测正则表⽰式,[\u4e00-\u9fa5]+3、如果存在中⽂乱码,则采⽤UTF-8编码解压替换后,还是有⼈反映乱码问题,烦~~~第⼆个问题报错如下(出现在有些rar格式解压时):WARNING: exception in archive constructor maybe file is encrypted or curruptde.innosystec.unrar.exception.RarException: badRarArchiveat de.innosystec.unrar.Archive.readHeaders(Archive.java:238)at de.innosystec.unrar.Archive.setFile(Archive.java:122)at de.innosystec.unrar.Archive.<init>(Archive.java:106)at de.innosystec.unrar.Archive.<init>(Archive.java:96)at com.reverse.zipFile.CopyOfZipFileUtil.unrar(CopyOfZipFileUtil.java:242)at com.reverse.zipFile.CopyOfZipFileUtil.main(CopyOfZipFileUtil.java:303)借助百度、⾕歌找资料发现:1、java解压⽂件有两种⽅式,⼀是⾃⼰写代码,⼆是调⽤压缩软件CMD执⾏2、第⼆个错误是由于WinRAR5之后,在rar格式的基础上,推出了另⼀种rar,叫RAR5,⽽java-unrar解析不了这种格式查看rar格式属性可以通过右键 —> 属性查看,如图因此需要舍弃代码解压的⽅式,改为CMD调⽤的⽅式,虽然压缩软件有很多,但从⽹上能找到执⾏命令的,也就WinRAR了,所以我们采⽤WinRAR5之后的版本解决,5之前的版本肯定是不⾏的了使⽤cmd⽅式效果如何呢?既能解决中⽂乱码问题,⼜能解压RAR5压缩⽂件,⽽且代码量还更少了,⽀持的格式也更多了。
如何在Java中进行文件压缩和解压缩操作
如何在Java中进行文件压缩和解压缩操作文件压缩和解压缩是程序开发中常见的操作,通过压缩可以减小文件的大小,节省存储空间,并且可以快速传输文件。
Java中提供了多种压缩和解压缩文件的方式,如ZipOutputStream和ZipInputStream等类。
本文将详细介绍在Java中进行文件压缩和解压缩的操作步骤和示例代码。
一、文件压缩文件压缩是将一个或多个文件打包成一个压缩文件,常见的压缩文件格式包括zip、tar、gz等。
在Java中,通常使用ZipOutputStream类实现文件压缩操作。
ZipOutputStream类是用于写入ZIP文件的输出流。
1.创建ZipOutputStream对象首先需要创建一个ZipOutputStream对象,用于写入ZIP文件。
可以通过FileOutputStream将ZipOutputStream链接到一个文件,然后就可以向文件中写入压缩数据。
```javaFileOutputStream fos = newFileOutputStream("compressed.zip");ZipOutputStream zos = new ZipOutputStream(fos);```2.添加文件到压缩文件接下来需要将要压缩的文件添加到ZipOutputStream中。
可以通过ZipEntry对象表示压缩文件中的每个文件或目录,并使用putNextEntry方法将文件添加到压缩文件中。
```javaFile file1 = new File("file1.txt");ZipEntry entry1 = new ZipEntry(file1.getName());zos.putNextEntry(entry1);FileInputStream fis1 = new FileInputStream(file1);byte[] buffer = new byte[1024];int length;while ((length = fis1.read(buffer)) > 0) {zos.write(buffer, 0, length);}zos.closeEntry();fis1.close();```3.完成压缩完成文件的添加后,需要关闭ZipOutputStream,以确保压缩文件保存到磁盘。
Java字符串的压缩与解压缩的两种方法
Java字符串的压缩与解压缩的两种⽅法应⽤场景当字符串太长,需要将字符串值存⼊数据库时,如果字段长度不够,则会出现插⼊失败;或者需要进⾏Http传输时,由于参数长度过长造成http传输失败等。
字符串压缩与解压⽅法⽅法⼀:⽤ Java8中的gzip/*** 使⽤gzip压缩字符串* @param str 要压缩的字符串* @return*/public static String compress(String str) {if (str == null || str.length() == 0) {return str;}ByteArrayOutputStream out = new ByteArrayOutputStream();GZIPOutputStream gzip = null;try {gzip = new GZIPOutputStream(out);gzip.write(str.getBytes());} catch (IOException e) {e.printStackTrace();} finally {if (gzip != null) {try {gzip.close();} catch (IOException e) {e.printStackTrace();}}}return new sun.misc.BASE64Encoder().encode(out.toByteArray());}/*** 使⽤gzip解压缩* @param compressedStr 压缩字符串* @return*/public static String uncompress(String compressedStr) {if (compressedStr == null) {return null;}ByteArrayOutputStream out = new ByteArrayOutputStream();ByteArrayInputStream in = null;GZIPInputStream ginzip = null;byte[] compressed = null;String decompressed = null;try {compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);in = new ByteArrayInputStream(compressed);ginzip = new GZIPInputStream(in);byte[] buffer = new byte[1024];int offset = -1;while ((offset = ginzip.read(buffer)) != -1) {out.write(buffer, 0, offset);}decompressed = out.toString();} catch (IOException e) {e.printStackTrace();} finally {if (ginzip != null) {try {ginzip.close();} catch (IOException e) {}}if (in != null) {try {in.close();} catch (IOException e) {}}if (out != null) {try {out.close();} catch (IOException e) {}}}return decompressed;}⽅法⼆:⽤mons.codec.binary.Base64/*** 使⽤mons.codec.binary.Base64压缩字符串* @param str 要压缩的字符串* @return*/public static String compress(String str) {if (str == null || str.length() == 0) {return str;}return Base64.encodeBase64String(str.getBytes());}/*** 使⽤mons.codec.binary.Base64解压缩* @param compressedStr 压缩字符串* @return*/public static String uncompress(String compressedStr) {if (compressedStr == null) {return null;}return Base64.decodeBase64(compressedStr);}注意事项在web项⽬中,服务器端将加密后的字符串返回给前端,前端再通过ajax请求将加密字符串发送给服务器端处理的时候,在http传输过程中会改变加密字符串的内容,导致服务器解压压缩字符串发⽣异常:java.util.zip.ZipException: Not in GZIP format解决⽅法:在字符串压缩之后,将压缩后的字符串BASE64加密,在使⽤的时候先BASE64解密再解压即可。
如何在java中解压zip和rar文件
一、解压rar文件。
由于WinRAR 是共享软件,并不是开源的,所以解压rar文件的前提是系统已经安装了winrar,比如本人的安装路径是:C:\\Program Files\\WinRAR\\winrar.exe然后运用ng.Process 的相关知识来运行系统命令行来实现解压的。
具体代码:Java代码*** 解压rar文件(需要系统安装Winrar 软件)*/public class UnRarFile {/*** 解压rar文件**/public void unRarFile(String targetPath, String absolutePath) {try {// 系统安装winrar的路径String cmd = "C:\\Program Files\\WinRAR\\winrar.exe";String unrarCmd = cmd + " x -r -p- -o+ " + absolutePath + " "+ targetPath;Process pre = rt.exec(unrarCmd);InputStreamReader isr = new InputStreamReader(pre.getInputStream()); BufferedReader bf = new BufferedReader(isr);String line = null;while ((line = bf.readLine()) != null) {line = line.trim();if ("".equals(line)) {continue;}System.out.println(line);}bf.close();} catch (Exception e) {System.out.println("解压发生异常");}}/***/public static void main(String[] args) {String targetPath = "D:\\test\\unrar\\";String rarFilePath = "D:\\test\\test.rar";UnRarFile unrar = new UnRarFile();unrar.unRarFile(targetPath, rarFilePath);}}二、解压zip文件由于zip是免费的,所以在jdk里提供了相应的类对zip文件的实现:java.util.zip.*,详细情况可以参考java APIJava代码/*** 解压zip文件*/public class UnzipFile {/*** 解压zip文件**/public void unzipFile(String targetPath, String zipFilePath) {try {File zipFile = new File(zipFilePath);InputStream is = new FileInputStream(zipFile);ZipInputStream zis = new ZipInputStream(is);ZipEntry entry = null;System.out.println("开始解压:" + zipFile.getName() + "...");while ((entry = zis.getNextEntry()) != null) {String zipPath = entry.getName();try {if (entry.isDirectory()) {File zipFolder = new File(targetPath + File.separator+ zipPath);if (!zipFolder.exists()) {zipFolder.mkdirs();}} else {File file = new File(targetPath + File.separator+ zipPath);if (!file.exists()) {File pathDir = file.getParentFile();pathDir.mkdirs();file.createNewFile();}FileOutputStream fos = new FileOutputStream(file); int bread;while ((bread = zis.read()) != -1) {fos.write(bread);}fos.close();}System.out.println("成功解压:" + zipPath);} catch (Exception e) {System.out.println("解压" + zipPath + "失败"); continue;}}zis.close();is.close();System.out.println("解压结束");} catch (Exception e) {e.printStackTrace();}}/***/public static void main(String[] args) { String targetPath = "D:\\test\\unzip"; String zipFile = "D:\\test\\test.zip"; UnzipFile unzip = new UnzipFile(); unzip.unzipFile(targetPath, zipFile); }}。
Java生成压缩文件(zip、rar格式)
Java⽣成压缩⽂件(zip、rar格式)jar坐标:<dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.5</version></dependency>话不多说,直接上代码package com.demo.student.util;import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipOutputStream;import java.io.*;/*** ⽣成压缩⽂件(zip,rar 格式)*/public class CompressUtil {/*** @param path 要压缩的⽂件路径* @param format ⽣成的格式(zip、rar)d*/public static void generateFile(String path, String format) throws Exception {File file = new File(path);// 压缩⽂件的路径不存在if (!file.exists()) {throw new Exception("路径 " + path + " 不存在⽂件,⽆法进⾏压缩...");}// ⽤于存放压缩⽂件的⽂件夹String generateFile = file.getParent() + File.separator +"CompressFile";File compress = new File(generateFile);// 如果⽂件夹不存在,进⾏创建if( !compress.exists() ){compress.mkdirs();}// ⽬的压缩⽂件String generateFileName = compress.getAbsolutePath() + File.separator + "AAA" + file.getName() + "." + format;// 输⼊流表⽰从⼀个源读取数据// 输出流表⽰向⼀个⽬标写⼊数据// 输出流FileOutputStream outputStream = new FileOutputStream(generateFileName);// 压缩输出流ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(outputStream));generateFile(zipOutputStream,file,"");System.out.println("源⽂件位置:" + file.getAbsolutePath() + ",⽬的压缩⽂件⽣成位置:" + generateFileName);// 关闭输出流zipOutputStream.close();}/*** @param out 输出流* @param file ⽬标⽂件* @param dir ⽂件夹* @throws Exception*/private static void generateFile(ZipOutputStream out, File file, String dir) throws Exception {// 当前的是⽂件夹,则进⾏⼀步处理if (file.isDirectory()) {//得到⽂件列表信息File[] files = file.listFiles();//将⽂件夹添加到下⼀级打包⽬录out.putNextEntry(new ZipEntry(dir + "/"));dir = dir.length() == 0 ? "" : dir + "/";//循环将⽂件夹中的⽂件打包for (int i = 0; i < files.length; i++) {generateFile(out, files[i], dir + files[i].getName());}} else { // 当前是⽂件// 输⼊流FileInputStream inputStream = new FileInputStream(file);// 标记要打包的条⽬out.putNextEntry(new ZipEntry(dir));// 进⾏写操作int len = 0;byte[] bytes = new byte[1024];while ((len = inputStream.read(bytes)) > 0) {out.write(bytes, 0, len);}// 关闭输⼊流inputStream.close();}} // 测试public static void main(String[] args) {String path = "";String format = "rar";try {generateFile(path, format);} catch (Exception e) {e.printStackTrace();System.out.println(e.getMessage());}}}结果图:压缩整个⽂件/*** 递归压缩⽂件* @param output ZipOutputStream 对象流* @param file 压缩的⽬标⽂件流* @param childPath 条⽬⽬录*/private static void zip(ZipOutputStream output,File file,String childPath){ FileInputStream input = null;try {// ⽂件为⽬录if (file.isDirectory()) {// 得到当前⽬录⾥⾯的⽂件列表File list[] = file.listFiles();childPath = childPath + (childPath.length() == 0 ? "" : "/")+ file.getName();// 循环递归压缩每个⽂件for (File f : list) {zip(output, f, childPath);}} else {// 压缩⽂件childPath = (childPath.length() == 0 ? "" : childPath + "/")+ file.getName();output.putNextEntry(new ZipEntry(childPath));input = new FileInputStream(file);int readLen = 0;byte[] buffer = new byte[1024 * 8];while ((readLen = input.read(buffer, 0, 1024 * 8)) != -1) {output.write(buffer, 0, readLen);}}} catch (Exception ex) {ex.printStackTrace();} finally {// 关闭流if (input != null) {try {input.close();} catch (IOException ex) {ex.printStackTrace();}}}}/*** 压缩⽂件(⽂件夹)* @param path ⽬标⽂件流* @param format zip 格式 | rar 格式* @throws Exception*/public static String zipFile(File path,String format) throws Exception {String generatePath = "";if( path.isDirectory() ){generatePath = path.getParent().endsWith("/") == false ? path.getParent() + File.separator + path.getName() + "." + format: path.getParent() + path.getName() + "." + format; }else {generatePath = path.getParent().endsWith("/") == false ? path.getParent() + File.separator : path.getParent();generatePath += path.getName().substring(0,path.getName().lastIndexOf(".")) + "." + format;}// 输出流FileOutputStream outputStream = new FileOutputStream( generatePath );// 压缩输出流ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(outputStream));zip(out, path,"");out.flush();out.close();return generatePath;}使⽤// 使⽤例⼦public static void main(String[] args) {String path = "F:/test";String format = "zip";try {System.out.println(zipFile(new File(path),format));} catch (Exception e) {e.printStackTrace();System.out.println(e.getMessage());}}解压/**** @param sourceZip 待解压⽂件路径* @param destDir 解压到的路径*/public static String unZip(String sourceZip, String destDir) {//保证⽂件夹路径最后是"/"或者"\"if( !destDir.endsWith("/") ){destDir += File.separator;}String newDir = "";File sourceFile = new File(sourceZip);newDir = sourceFile.getName().substring(0,sourceFile.getName().lastIndexOf("."));File destDirFile = new File(destDir + newDir);Project p = new Project();Expand e = new Expand();e.setProject(p);e.setSrc(sourceFile);e.setOverwrite(true);e.setDest(destDirFile);/*ant下的zip⼯具默认压缩编码为UTF-8编码,⽽winRAR软件压缩是⽤的windows默认的GBK或者GB2312编码所以解压缩时要制定编码格式*/e.setEncoding("gbk");e.execute();return destDirFile.getAbsolutePath();}。
java解压缩.gz.zip.tar.gz等格式的压缩包方法总结
java解压缩.gz.zip.tar.gz等格式的压缩包⽅法总结1、.gz⽂件是linux下常见的压缩格式。
使⽤ java.util.zip.GZIPInputStream即可,压缩是 java.util.zip.GZIPOutputStream1public static void unGzipFile(String sourcedir) {2 String ouputfile = "";3try {4//建⽴gzip压缩⽂件输⼊流5 FileInputStream fin = new FileInputStream(sourcedir);6//建⽴gzip解压⼯作流7 GZIPInputStream gzin = new GZIPInputStream(fin);8//建⽴解压⽂件输出流9 ouputfile = sourcedir.substring(0,stIndexOf('.'));10 ouputfile = ouputfile.substring(0,stIndexOf('.'));11 FileOutputStream fout = new FileOutputStream(ouputfile);1213int num;14byte[] buf=new byte[1024];1516while ((num = gzin.read(buf,0,buf.length)) != -1)17 {18 fout.write(buf,0,num);19 }2021 gzin.close();22 fout.close();23 fin.close();24 } catch (Exception ex){25 System.err.println(ex.toString());26 }27return;28 }2、zip⽂件,使⽤java.util.zip.ZipEntry 和 java.util.zip.ZipFile1/**2 * 解压缩zipFile3 * @param file 要解压的zip⽂件对象4 * @param outputDir 要解压到某个指定的⽬录下5 * @throws IOException6*/7public static void unZip(File file,String outputDir) throws IOException {8 ZipFile zipFile = null;910try {11 Charset CP866 = Charset.forName("CP866"); //specifying alternative (non UTF-8) charset12//ZipFile zipFile = new ZipFile(zipArchive, CP866);13 zipFile = new ZipFile(file, CP866);14 createDirectory(outputDir,null);//创建输出⽬录1516 Enumeration<?> enums = zipFile.entries();17while(enums.hasMoreElements()){1819 ZipEntry entry = (ZipEntry) enums.nextElement();20 System.out.println("解压." + entry.getName());2122if(entry.isDirectory()){//是⽬录23 createDirectory(outputDir,entry.getName());//创建空⽬录24 }else{//是⽂件25 File tmpFile = new File(outputDir + "/" + entry.getName());26 createDirectory(tmpFile.getParent() + "/",null);//创建输出⽬录2728 InputStream in = null;29 OutputStream out = null;30try{31 in = zipFile.getInputStream(entry);;32 out = new FileOutputStream(tmpFile);33int length = 0;3435byte[] b = new byte[2048];36while((length = in.read(b)) != -1){37 out.write(b, 0, length);38 }3940 }catch(IOException ex){41throw ex;42 }finally{43if(in!=null)44 in.close();45if(out!=null)46 out.close();47 }48 }49 }5051 } catch (IOException e) {52throw new IOException("解压缩⽂件出现异常",e);53 } finally{54try{55if(zipFile != null){56 zipFile.close();57 }58 }catch(IOException ex){59throw new IOException("关闭zipFile出现异常",ex);60 }61 }62 }6364/**65 * 构建⽬录66 * @param outputDir67 * @param subDir68*/69public static void createDirectory(String outputDir,String subDir){70 File file = new File(outputDir);71if(!(subDir == null || subDir.trim().equals(""))){//⼦⽬录不为空72 file = new File(outputDir + "/" + subDir);73 }74if(!file.exists()){75if(!file.getParentFile().exists())76 file.getParentFile().mkdirs();77 file.mkdirs();78 }79 }3、.tar.gz⽂件可以看做先⽤tar打包,再使⽤gz进⾏压缩。
javaGZIP压缩与解压缩
javaGZIP压缩与解压缩1.GZIP压缩public static byte[] compress(String str, String encoding) {if (str == null || str.length() == 0) {return null;}ByteArrayOutputStream out = new ByteArrayOutputStream();GZIPOutputStream gzip;try {gzip = new GZIPOutputStream(out);gzip.write(str.getBytes(encoding));gzip.close();} catch ( Exception e) {e.printStackTrace();}return out.toByteArray();}2.GZIP解压缩public static byte[] uncompress(byte[] bytes) {if (bytes == null || bytes.length == 0) {return null;}ByteArrayOutputStream out = new ByteArrayOutputStream();ByteArrayInputStream in = new ByteArrayInputStream(bytes);try {GZIPInputStream ungzip = new GZIPInputStream(in);byte[] buffer = new byte[256];int n;while ((n = ungzip.read(buffer)) >= 0) {out.write(buffer, 0, n);}} catch (Exception e) {e.printStackTrace();}return out.toByteArray();}3.⼯具代码集合import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;public class GZIPUtils {public static final String GZIP_ENCODE_UTF_8 = "UTF-8";public static final String GZIP_ENCODE_ISO_8859_1 = "ISO-8859-1";public static byte[] compress(String str, String encoding) {if (str == null || str.length() == 0) {return null;}ByteArrayOutputStream out = new ByteArrayOutputStream();GZIPOutputStream gzip;try {gzip = new GZIPOutputStream(out);gzip.write(str.getBytes(encoding));gzip.close();} catch ( Exception e) {e.printStackTrace();}return out.toByteArray();}public static byte[] compress(String str) throws IOException {return compress(str, GZIP_ENCODE_UTF_8);}public static byte[] uncompress(byte[] bytes) {if (bytes == null || bytes.length == 0) {return null;}ByteArrayOutputStream out = new ByteArrayOutputStream();ByteArrayInputStream in = new ByteArrayInputStream(bytes);try {GZIPInputStream ungzip = new GZIPInputStream(in);byte[] buffer = new byte[256];int n;while ((n = ungzip.read(buffer)) >= 0) {out.write(buffer, 0, n);}} catch (Exception e) {e.printStackTrace();}return out.toByteArray();}public static String uncompressToString(byte[] bytes, String encoding) {if (bytes == null || bytes.length == 0) {return null;}ByteArrayOutputStream out = new ByteArrayOutputStream();ByteArrayInputStream in = new ByteArrayInputStream(bytes);try {GZIPInputStream ungzip = new GZIPInputStream(in);byte[] buffer = new byte[256];int n;while ((n = ungzip.read(buffer)) >= 0) {out.write(buffer, 0, n);}return out.toString(encoding);} catch (Exception e) {e.printStackTrace();}return null;}public static String uncompressToString(byte[] bytes) {return uncompressToString(bytes, GZIP_ENCODE_UTF_8);}public static void main(String[] args) throws IOException {String s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";System.out.println("字符串长度:"+s.length());System.out.println("压缩后::"+compress(s).length);System.out.println("解压后:"+uncompress(compress(s)).length);System.out.println("解压字符串后::"+uncompressToString(compress(s)).length()); }}。
Java中ZIP压缩与解压--中文文件名乱码解决办法
Java中ZIP压缩与解压--中⽂⽂件名乱码解决办法Apache Ant有个包专门处理ZIP⽂件,可以指定⽂件名的编码⽅式。
由此可以解决问题。
例如:⽤org.apache.tools.zip.ZipOutputStream代替java.util.zip.ZipOutputStream。
java对於⽂字的编码是以 unicode为基础,因此,若是以ZipInputStream及ZipOutputStream来处理压缩及解压缩的⼯作,碰到中⽂档名或路径,那当然是以unicode来处理。
但是,现在市⾯上的压缩及解压缩软体,例如winzip,却是不⽀援unicode的,⼀碰到档名以unicode编码的档案,它就不处理。
那要如何才能做出让WinRar能够处理的压缩档呢?那就得从修改ZipInputStream及ZipOutputStream对於档名的编码⽅式来着⼿了。
我们可以从jdk的src.zip取得ZipInputStream及ZipOutputStream的原始码来加以修改。
⼀、ZipOutputStream.java1.从jdk的src.zip取得ZipOutputStream.java原始码,另存到⼀个新⽂件中,档名改为CnZipOutputStream.java。
2.开始修改原始码,将class名称改为CnZipOutputStream3.建构式也必须更改为CnZipOutputStream4.新增member,这个member记录编码⽅式private String encoding="UTF-8";5.再新增⼀个建构式(这个建构式可以让这个class在new的时候,设定档名的编码)public CZipOutputStream(OutputStream out,String encoding) {this(out);this.encoding=encoding;}6.找到byte[] nameBytes = getUTF8Bytes();(有⼆个地⽅),将它修改如下:byte[] nameBytes = null;try{if (this.encoding.toUpperCase().equals("UTF-8"))nameBytes =getUTF8Bytes();elsenameBytes= .getBytes(this.encoding);}catch(Exception byteE){nameBytes=getUTF8Bytes();}⼆、ZipInputStream.java1.从jdk的src.zip取得ZipInputStream.java原始码,另存到⼀个新⽂件中,档名改为CnZipInputStream.java。
ZIP4j压缩与解压的实例详解
ZIP4j压缩与解压的实例详解ZIP4j 压缩与解压的实例详解使⽤的jar包:zip4j_1.3.2.jar基本功能:针对ZIP压缩⽂件创建、添加、分卷、更新和移除⽂件(读写有密码保护的Zip⽂件)(⽀持AES 128/256算法加密)(⽀持标准Zip算法加密)(⽀持zip64格式)(⽀持Store(仅打包,默认不压缩,不过可以⼿动设置⼤⼩)和Deflate压缩⽅法(针对分块zip⽂件创建和抽出⽂件)(⽀持编码)(进度监控)压缩⽅式(3种):static final int COMP_STORE = 0;(仅打包,不压缩)(对应好压的存储)static final int COMP_DEFLATE = 8;(默认)(对应好压的标准)static final int COMP_AES_ENC = 99;压缩级别有5种:(默认0不压缩)级别跟好压软件是对应的;static final int DEFLATE_LEVEL_FASTEST = 1;static final int DEFLATE_LEVEL_FAST = 3;static final int DEFLATE_LEVEL_NORMAL = 5;static final int DEFLATE_LEVEL_MAXIMUM = 7;static final int DEFLATE_LEVEL_ULTRA = 9;加密⽅式:static final int ENC_NO_ENCRYPTION = -1;(默认,没有加密⽅法,如果采⽤此字段,会报错”没有提供加密算法”)static final int ENC_METHOD_STANDARD = 0;static final int ENC_METHOD_AES = 99;AES Key Strength:(默认-1,也就是ENC_NO_ENCRYPTION)static final int AES_STRENGTH_128 = 0x01;static final int AES_STRENGTH_192 = 0x02;static final int AES_STRENGTH_256 = 0x03;从构造⽅法可以默认情况:compressionMethod = P_DEFLATE;encryptFiles = false;//不设密码readHiddenFiles = true;//可见encryptionMethod = Zip4jConstants.ENC_NO_ENCRYPTION;//加密⽅式不加密aesKeyStrength = -1;//includeRootFolder = true;//timeZone = TimeZone.getDefault();//发现的现象:在采取默认压缩时:1.如果此压缩⽂件已经存在,那么压缩后,相同的⽂件会替换(有密码,密码被替换),原来不同的⽂件会继续保留,⽽且⽂件的时间还是第⼀次压缩的时间;如果想完全覆盖,那么需要判断此压缩⽂件存不存在,存在就删除;2.假如a⽂件加密⽣成了a.zip,此时如果再把其他的⽂件b也加密,然后⽣成同样的a.zip,那么a.zip⾥⾯的⽂件a,b将会有各⾃的密码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
压缩的import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;public class Zip {static final int BUFFER = 2048;public static void main(String argv[]) {try {BufferedInputStream origin = null;FileOutputStream dest = new FileOutputStream("E:\\test\\myfiles.zip");ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));byte data[] = new byte[BUFFER];File f = new File("e:\\test\\a\\");File files[] = f.listFiles();for (int i = 0; i < files.length; i++) {FileInputStream fi = new FileInputStream(files[i]);origin = new BufferedInputStream(fi, BUFFER);ZipEntry entry = new ZipEntry(files[i].getName());out.putNextEntry(entry);int count;while ((count = origin.read(data, 0, BUFFER)) != -1) {out.write(data, 0, count);}origin.close();}out.close();} catch (Exception e) {e.printStackTrace();}}}2,解压缩的。
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;public class UnZip {static final int BUFFER = 2048;public static void main(String argv[]) {try {String fileName = "E:\\test\\myfiles.zip";String filePath = "E:\\test\\";ZipFile zipFile = new ZipFile(fileName);Enumeration emu = zipFile.entries();int i=0;while(emu.hasMoreElements()){ZipEntry entry = (ZipEntry)emu.nextElement();//会把目录作为一个file读出一次,所以只建立目录就可以,之下的文件还会被迭代到。
if (entry.isDirectory()){new File(filePath + entry.getName()).mkdirs();continue;}BufferedInputStream bis = new BufferedInputStream(z ipFile.getInputStream(entry));File file = new File(filePath + entry.getName());//加入这个的原因是zipfile读取文件是随机读取的,这就造成可能先读取一个文件//而这个文件所在的目录还没有出现过,所以要建出目录来。
File parent = file.getParentFile();if(parent != null && (!parent.exists())){parent.mkdirs();}FileOutputStream fos = new FileOutputStream(file);BufferedOutputStream bos = new BufferedOutputStream (fos,BUFFER);int count;byte data[] = new byte[BUFFER];while ((count = bis.read(data, 0, BUFFER)) != -1){bos.write(data, 0, count);}bos.flush();bos.close();bis.close();}zipFile.close();} catch (Exception e) {e.printStackTrace();}}}偶尔一次,遇到这样一个问题,要求对zip文件进行解压缩,并读取压缩包中.txt 和.inf文件的数据,经过jdk Helper 和Google才将问题得以解决。
这里只写了解压过程,在main方法中压缩包存放路径和解压到目标的文件已经硬编码进去了。
程序整体结构不是很令人满意,仍然需要重构.......package com.da.unzip;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.Reader;import java.nio.ByteBuffer;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;public class Unzip {public static void main(String args) throws Exception {Unzip unzip = new Unzip();String zippath = "C:\\unzip\\";// /解压到的目标文件路径String zipDir = "C:\\data\\";// 要解压的压缩文件的存放路径File file = new File(zipDir);List list = unzip.getSubFiles(file);for (Object obj : list) {String realname = ((File)obj).getName();System.out.println(realname);int end = stIndexOf(".");System.out.println("要解压缩的文件名.........."+zipDir+realname);System.out.println("解压到的目录" +zippath+realname.substring(0,end));unzip.testReadZip(zippath,zipDir+realname);}}/** 解压缩功能. 将zippath目录文件解压到unzipPath目录下. @throwsException*/public void ReadZip(String zippath, String unzipPath) throws Exception{ZipFile zfile = new ZipFile(unzipPath);// 生成一个zip文件对象System.out.println(zfile.getName());// 获取要解压的zip的文件名全路径 Enumeration zList = zfile.entries();// 返回枚举对象ZipEntry ze = null;// 用于表示ZIP 文件条目byte buf = new byte[1024];// 声明字节数组/*** 循环获取zip文件中的每一个文件*/while (zList.hasMoreElements()) {// 从ZipFile中得到一个ZipEntryze = (ZipEntry) zList.nextElement();if (ze.isDirectory())// 如果为目录条目,则返回true,执行下列语句{System.out.println("Dir: " + ze.getName() + " skipped..");continue;}int begin = zfile.getName().lastIndexOf("\\") + 1;int end = zfile.getName().lastIndexOf(".");String zipRealName = zfile.getName().substring(begin, end);System.out.println("解压缩开始Extracting:"+ze.getName()+"\t"+ze.getSize()+"\t"+ze.getCompressedSize());// 以ZipEntry为参数得到一个InputStream,并写到OutputStream中,并加上缓冲OutputStream os = new BufferedOutputStream( new FileOutputStream(getRealFileName(zippath + "\\"+ zipRealName, ze.getName())));InputStream is = newBufferedInputStream(zfile.getInputStream(ze));String fileName = getRealFileName(zippath,ze.getName()).getName();System.out.println("解压出的文件名称:" + fileName);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 zippath* 指定根目录* @param absFileName* 相对路径名,来自于ZipEntry中的name* @return java.io.File 实际的文件*/private File getRealFileName(String zippath, String absFileName) {String dirs = absFileName.split("/", absFileName.length());File ret = new File(zippath);// 创建文件对象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]);// 根据ret 抽象路径名和child // 路径名字符串创建一个新File 实例return ret;}}。