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 + " 个文件被释放。"); } }