ZipEntry、ZipInputStream和ZipOutputStream三个Java类实现zip数据压缩方式的编程方法。
zip压缩文件结构:一个zip文件由多个entry组成,每个entry有一个唯一的名称,entry的数据项存储压缩数据。
与zip文件有关的几个Java类
・类ZipEntry
public ZipEntry(String name);
name为指定的数据项名。
・类ZipOutputStream
ZipOutputStream实现了zip压缩文件的写输出流,支持压缩和非压缩entry。下面是它的几个函数:
public ZipOutputStream(OutputStream out);
∥利用输出流out构造一个ZIP输出流。
public void setMethod(int method);
∥设置entry压缩方法,缺省值为DEFLATED。
public void putNextEntry(ZipEntry newe);
∥如果当前的entry存在且处于激活状态时,关闭它,在zip文件中写入新的entry-newe
并将数据流定位于entry数据项的起始位置,压缩方法为setMethod指定的方法。
・类ZipInputStream
ZipInputStream实现了zip压缩文件的读输入流,支持压缩和非压缩entry。下面是它的
几个函数:
public ZipInputStream(InputStream in);
∥利用输入流in构造一个ZIP输出流。
public ZipEntry getNextEntry();
∥返回ZIP文件中的下一个entry,并将输出流定位在此entry数据项的起始位置。
public void closeEntry();
∥关闭当前的zip entry,并将数据流定位于下一个entry的起始位置。
需要导入ant.jar包
下面是压缩的:
package org.cfsdc.action; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.apache.struts2.ServletActionContext; public class Test { public static void main(String[] args) throws Exception { String inputpath = "D:\\zipTest"; String zipOutpath = "D:\\ziptest.zip"; zipTest(inputpath,zipOutpath); unZip ( "D:\\ziptest.zip" , "D://opt" ); } private static void zipTest(String inputpath, String zipFile) throws IOException { ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile)); File inputpathFile = new File(inputpath); if(inputpathFile.exists() && inputpathFile.isDirectory()){ File[] inputs = inputpathFile.listFiles(); for(File i :inputs){ out.putNextEntry(new ZipEntry(i.getName())); getZip(i.getAbsoluteFile(),out); } } out.flush(); out.close(); } private static void getZip(File absoluteFile, ZipOutputStream out) throws IOException { InputStream input = new FileInputStream(absoluteFile);//这里只能输入文件 byte[] buffer = new byte[2048]; int len=-1; while((len=input.read(buffer))!= -1){ out.write(buffer, 0, len); } } }
下面是解压的方法
/** * 解压 */ public static void unZip(String zipfile, String destDir) { destDir = destDir.endsWith( "//" ) ? destDir : destDir + "//" ; byte b[] = new byte [1024]; int length; ZipFile zipFile; try { zipFile = new ZipFile( new File(zipfile)); Enumeration enumeration = zipFile.getEntries(); ZipEntry zipEntry = null ; while (enumeration.hasMoreElements()) { zipEntry = (ZipEntry) enumeration.nextElement(); File loadFile = new File(destDir + zipEntry.getName()); if (zipEntry.isDirectory()) { // 这段都可以不要,因为每次都貌似从最底层开始遍历的 loadFile.mkdirs(); } else { if (!loadFile.getParentFile().exists()) loadFile.getParentFile().mkdirs(); OutputStream outputStream = new FileOutputStream(loadFile); InputStream inputStream = zipFile.getInputStream(zipEntry); while ((length = inputStream.read(b)) > 0) outputStream.write(b, 0, length); } } System. out .println( " 文件解压成功 " ); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }