Java文件压缩与解压缩(一)(一)

2014-11-24 10:55:43 · 作者: · 浏览: 0
[java]
package com.cn;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
//错误小结:
//1 关于file.isFile()与file.isDirectory()记忆出了偏差.
// 错误以为若是Directory一定是file,file不一定是Directory
// 更正:file和Directory是两码事.只能是file或Directory中其中一个.
//2 并不是说我们执行一句File f=new File("F:\\x.txt");
// 在本地硬盘上就生成了一个x.txt文件.而应该进行如下的
// 操作才可以.
// File f=new File("F:\\x.txt");
// if (!f.exists()) {
// f.createNewFile();
// }
// 其中f.createNewFile()表示创建了一个空文件
//
// 多数的情况下,我们执行了File f=new File("F:\\x.txt")
// 以后再利用输入流,输出流对f进行操作,比如往该x.txt文件中
// 写入hello world
//
//3 血的教训:
// zip()方法中没有关闭流zos.导致压缩后的文件解压时出错
//重要总结:
//1 关于zip和unzip的核心操作对象是每一个文件!!!
// 比如碰到一个directory,那么会去遍历里面的每一个文件,挨个对其进行压缩.
// 不要错误地理解,若是一个directory,那么会将其作为一个整体进行压缩.
//2 在JAVA中每一个压缩文件都用一个ZipEntry表示
// 所以在压缩的过程中要得到每个文件的完整路径(从最外层文件夹至文件本身)
// 用此完整路径为每个压缩文件new()一个ZipEntry
//3 所以利用zipEntry可记录原来的目录层次.解压后才保持原样
// 也可以看到在解压时利用entrys.hasMoreElements()来挨个
// 解压每个zipEntry.
// 参见解压中的代码:
// perUnzipFilePath = unzipPath + zipEntry.getName();
public class TestZipAndUnZip {
public static void main(String[] args) throws Exception {
TestZipAndUnZip test=new TestZipAndUnZip();
//压缩和解压单个文件
test.zip2("F:\\kk\\cc.txt","F:\\11.zip");
test.unZipFile2("F:\\11.zip", "F:\\test11");
//压缩和解压一个目录
test.zip2("F:\\kk","F:\\22.zip");
test.unZipFile2("F:\\22.zip", "F:\\test22");
}
/**
* 该方法将一个给定路径的文件压缩
* @param willZipPath 待压缩文件的路径
* @param zipedPath 该文件压缩后的路径
*/
public void zip2(String willZipPath, String zipedPath) {
try {
File willZipFile = new File(willZipPath);
File zipedFile = new File(zipedPath);
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipedFile));
if (willZipFile.isFile()) {
fileToZip2(willZipPath, zos);
}
if (willZipFile.isDirectory()) {
dirToZip2(willZipPath, willZipFile, zos);
}
// 方法调用完成后关闭流
zos.close();
} catch (Exception e) {
}
}
/**
* @param willZipFilePath 待压缩文件的路径
* @param zos 压缩文件输出流
* 1 关于以下两句代码
* ZipEntry entry = new ZipEntry();
* zos.putNextEntry(entry);
* 把生成的ZipEntry对象加入到压缩文件中
* 之后往压缩文件中写入的内容均放在该ZipEntry对象中
*
* 2 fis.close()但是不能在此处zos.close()
* 因为该zos是上一方法传递过来的.可能在压缩目录的时候会
* 再次使用到该zos流.若此时关闭,则导致目录中的一个文件
* 被压缩
*/
public void fileToZip2(String willZipFilePath,ZipOutputStream zos){
try {
File willZipFile=new File(willZipFilePath);
ZipEntry entry = new ZipEntry(getEntryName2(willZipFilePath, willZipFile));
zos.putNextEntry(entry);
FileInputStream fis = new FileInputStream(willZipFilePath);