转载:java jdk实例宝典
感觉讲的非常好就转载在这保存!
java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包。
使用zipoutputstream能够实现文件压缩,全部写入到zipoutputstream输入流中的数据,都会被ZIP格式压缩。
每一个被压缩的文件或者文件夹在zip文件里都相应一个zipentry对象,每一个zipentry都有一个name属性,表示它相对于zip文件文件夹的相对路径,对于文件夹,路径以“/“结尾,对于文件,路劲以文件名称结尾。
zipoutputstream的putnextentry方法往zip文件里加入zipentry,紧接着写入到该文件zipoutputstream流中的数据都被保存到zipentry中,知道调用zipoutputstream的closeentry方法。
zipfile表示一个zip文件,它的entries方法能获得zip文件里的zipentry集合。的奥zipentry的输入流。
实例:
package book.io;
import java.io.File;
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipOutputStream;/**
* 用ZIP压缩和解压缩文件或文件夹 */public class CompressUtil {/**
* 压缩文件或者文件夹 * @param baseDirName 压缩的根文件夹 * @param fileName 根文件夹下待压缩的文件或文件夹名, * 星号*表示压缩根文件夹下的所有文件。 * @param targetFileName 目标ZIP文件 */ public static void zipFile(String baseDirName, String fileName, String targetFileName){ //检測根文件夹是否存在 if (baseDirName == null){ System.out.println("压缩失败,根文件夹不存在:" + baseDirName); return; } File baseDir = new File(baseDirName); if (!baseDir.exists() || (!baseDir.isDirectory())){ System.out.println("压缩失败,根文件夹不存在:" + baseDirName); return; } String baseDirPath = baseDir.getAbsolutePath(); //目标文件 File targetFile = new File(targetFileName); try{ //创建一个zip输出流来压缩数据并写入到zip文件 ZipOutputStream out =new ZipOutputStream( new FileOutputStream(targetFile)); if (fileName.equals("*")){ //将baseDir文件夹下的所有文件压缩到ZIP CompressUtil.dirToZip(baseDirPath, baseDir, out); } else { File file = new File(baseDir, fileName); if (file.isFile()){ CompressUtil.fileToZip(baseDirPath, file, out); } else { CompressUtil.dirToZip(baseDirPath, file, out); } } out.close(); System.out.println("压缩文件成功,目标文件名称:" + targetFileName); } catch (IOException e){ System.out.println("压缩失败:" + e); e.printStackTrace(); } }/**
* 解压缩ZIP文件,将ZIP文件中的内容解压到targetDIR文件夹下 * @param zipName 待解压缩的ZIP文件名称 * @param targetBaseDirName 目标文件夹 */ public static void upzipFile(String zipFileName, String targetBaseDirName){ if (!targetBaseDirName.endsWith(File.separator)){ targetBaseDirName += File.separator; } try { //依据ZIP文件创建ZipFile对象 ZipFile zipFile = new ZipFile(zipFileName); ZipEntry entry = null; String entryName = null; String targetFileName = null; byte[] buffer = new byte[4096]; int bytes_read; //获取ZIP文件中全部的entry Enumeration entrys = zipFile.entries(); //遍历全部entry while (entrys.hasMoreElements()) { entry = (ZipEntry)entrys.nextElement(); //获得entry的名字 entryName = entry.getName(); targetFileName = targetBaseDirName + entryName; if (entry.isDirectory()){ // 假设entry是一个文件夹,则创建文件夹 new File(targetFileName).mkdirs(); continue; } else { // 假设entry是一个文件,则创建父文件夹 new File(targetFileName).getParentFile().mkdirs(); }//否则创建文件
File targetFile = new File(targetFileName); System.out.println("创建文件:" + targetFile.getAbsolutePath()); //打开文件输出流 FileOutputStream os = new FileOutputStream(targetFile); //从ZipFile对象中打开entry的输入流 InputStream is = zipFile.getInputStream(entry); while ((bytes_read = is.read(buffer)) != -1){ os.write(buffer, 0, bytes_read); } //关闭流 os.close( ); is.close( ); } System.out.println("解压缩文件成功!"); } catch (IOException err) { System.err.println("解压缩文件失败: " + err); } } /** * 将文件夹压缩到ZIP输出流。 */ private static void dirToZip(String baseDirPath, File dir, ZipOutputStream out){ if (dir.isDirectory()){ //列出dir文件夹下全部文件 File[] files = dir.listFiles(); // 假设是空文件夹 if (files.length == 0){ ZipEntry entry = new ZipEntry(getEntryName(baseDirPath, dir)); // 存储文件夹信息 try { out.putNextEntry(entry); out.closeEntry(); } catch (IOException e) { e.printStackTrace(); } return; } for (int i=0; i<files.length; i++){ if (files[i].isFile()){ //假设是文件,调用fileToZip方法 CompressUtil.fileToZip(baseDirPath, files[i], out); } else { //假设是文件夹,递归调用 CompressUtil.dirToZip(baseDirPath, files[i], out); } } } } /** * 将文件压缩到ZIP输出流 */ private static void fileToZip(String baseDirPath, File file, ZipOutputStream out){ FileInputStream in = null; ZipEntry entry = null; // 创建复制缓冲区 byte[] buffer = new byte[4096]; int bytes_read; if (file.isFile()){ try { // 创建一个文件输入流 in = new FileInputStream(file); // 做一个ZipEntry entry = new ZipEntry(getEntryName(baseDirPath, file)); // 存储项信息到压缩文件 out.putNextEntry(entry); // 复制字节到压缩文件 while((bytes_read = in.read(buffer)) != -1){ out.write(buffer, 0, bytes_read); } out.closeEntry(); in.close(); System.out.println("加入文件" + file.getAbsolutePath() + "被到ZIP文件里!"); } catch (IOException e){ e.printStackTrace(); } } } /** * 获取待压缩文件在ZIP文件里entry的名字。即相对于跟文件夹的相对路径名 * @param baseDirPath * @param file * @return */ private static String getEntryName(String baseDirPath, File file){ if (!baseDirPath.endsWith(File.separator)){ baseDirPath += File.separator; } String filePath = file.getAbsolutePath(); // 对于文件夹,必须在entry名字后面加上"/",表示它将以文件夹项存储。 if (file.isDirectory()){ filePath += "/"; } int index = filePath.indexOf(baseDirPath); return filePath.substring(index + baseDirPath.length()); } public static void main(String[] args) { //压缩C盘下的temp文件夹,压缩后的文件是C:/temp.zip String baseDirName = "C:/"; String fileName = "temp/"; String zipFileName = "C:/temp.zip"; CompressUtil.zipFile(baseDirName, fileName, zipFileName); //将刚创建的ZIP文件解压缩到D盘的temp文件夹下 System.out.println(); fileName = "D:/temp"; CompressUtil.upzipFile(zipFileName, fileName); }}