java编程笔记18 文件压缩与解压缩

在java中,主要是利用ZipEntry,ZipInputStream和ZipOutputStream来实现zip数据压缩方式的编程方法,

构造方法摘要
ZipEntry(String name)
          使用指定名称创建新的 ZIP 条目。
构造方法摘要
ZipInputStream(InputStream in)
          创建新的 ZIP 输入流。
构造方法摘要
ZipOutputStream(OutputStream out)
          创建新的 ZIP 输出流。

ZipInputStream的主要方法

ZipEntry getNextEntry()
          读取下一个 ZIP 文件条目并将流定位到该条目数据的开始处。
 void closeEntry()
          关闭当前 ZIP 条目并定位流以读取下一个条目。

压缩测试程序:

package com.book.ch09.file;

import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class CompressFile {
	
	public static void addFile(ZipOutputStream zipOutput, File file) throws IOException{
		
		System.out.println("正在添加文件:" + file.getAbsolutePath());
		
		// 每个压缩对象都为一个 ZipEntry 实例。
		ZipEntry zipEntry = new ZipEntry(file.getName());
		
		// 将这个实例放入压缩文件中
		zipOutput.putNextEntry(zipEntry);
		
		// 读取文件内容
		FileInputStream ins = new FileInputStream(file);
		
		byte[] tmp = new byte[1024];
		int len = 0;
		
		while((len = ins.read(tmp)) != -1){
			zipOutput.write(tmp, 0, len);
		}
		
		ins.close();
		
		// 关闭当前的 ZipEntry 实例
		zipOutput.closeEntry();
		
	}
	
	public static void main(String[] args) throws IOException{
		
		File sourceFolder = new File("D:\\常用软件");
		File targetFile = new File("D:\\zip_test.zip");
		
		// 使用 ZipOutputStream 创建压缩文件
		ZipOutputStream zipOutput = new ZipOutputStream(new FileOutputStream(targetFile));
		
		// 列出该文件夹下所有的文件
		File[] subFiles = sourceFolder.listFiles(new FileFilter(){
			public boolean accept(File pathname) {
				if(pathname.isFile())	return true;
				return false;
			}
		});
		
		
		System.out.println("\r\n文件压缩开始:" +sourceFolder.getAbsolutePath()+"\n\n");
		
		for(int i=0; i<subFiles.length; i++){
			addFile(zipOutput, subFiles[i]);
		}
		
		zipOutput.close();
		
		System.out.println("\r\n文件压缩完成:" + targetFile.getAbsolutePath());
	}

}

运行结果:


文件压缩开始:D:\常用软件


正在添加文件:D:\常用软件\apache_2.2.4-win32-x86-no_ssl.zip
正在添加文件:D:\常用软件\CAJViewer7.0.zip
正在添加文件:D:\常用软件\CCleaner.rar
正在添加文件:D:\常用软件\CTeX_2.8.0.125.exe
正在添加文件:D:\常用软件\download
正在添加文件:D:\常用软件\DUBA2008_down_31_4306.exe
正在添加文件:D:\常用软件\DZH_INTERNET_V560w.exe
正在添加文件:D:\常用软件\EasyRecoveryPro-v6.20.rar
正在添加文件:D:\常用软件\FinalData-v2.01.rar
正在添加文件:D:\常用软件\FirefoxChinaEdition 2010.12.exe
正在添加文件:D:\常用软件\FirefoxChinaEdition-latest.exe
正在添加文件:D:\常用软件\fxalendar.exe
............

............


文件压缩完成:D:\zip_test.zip

解压缩:

package com.book.ch09.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UncompressFile {
	
	static int count = 0;
	
	public static void extractFile(File path, ZipInputStream zipIns, ZipEntry zipEntry) throws IOException{
		
		File file = new File(path, zipEntry.getName());
		
		System.out.println("正在释放文件:" + file.getAbsolutePath());
		
		FileOutputStream ous = new FileOutputStream(file);
		
		byte[] tmp = new byte[1024];
		int len = 0;
		
		while((len = zipIns.read(tmp)) != -1){
			ous.write(tmp, 0, len);
		}
		
		ous.close();
		
		zipIns.closeEntry();
		
		count++;
	}
	
	public static void main(String[] args) throws IOException{
		
		File sourceZipFile = new File("c:\\zip_test.zip");
		File targetFolder = new File("C:\\zip_test");
		
		targetFolder.mkdir();
		
		ZipInputStream zipIns = new ZipInputStream(new FileInputStream(sourceZipFile));
		
		ZipEntry zipEntry = zipIns.getNextEntry();
		
		while(zipEntry != null){

			extractFile(targetFolder, zipIns, zipEntry);
			
			zipEntry = zipIns.getNextEntry();
		}
		
		zipIns.close();
		
		System.out.println("\r\n文件释放完成。" + count + " 个文件被释放。");
		
	}

}
posted @ 2011-03-19 14:30  jinmengzhe  阅读(711)  评论(0编辑  收藏  举报