首先,与此相关的类是java.util.zip.ZipOutputStream,其构造函数为ZipOutputStream(OutputStream out)。
下面以一个实例来说明如何用java完成对文件的压缩。
package ziptest; import java.io.*; import java.util.zip.*; public class Zip{ static final int BUFFER = 2048; static boolean flag = false; public static void main(String[] args) throws IOException{ File file = new File("D:/TT"); boolean b1 = file.exists(); if(!b1) throw new RuntimeException("The Dir is not exist!"); ZipSubdirectory(file); //FileInputStream file1 = new FileInputStream(ZipSubdirectory(file)); //这两段话是为何... //System.out.println(file1.toString()); } public static File ZipSubdirectory(File myDir) throws IOException{ BufferedInputStream origin = null; File zipFile = new File("D:/" + myDir.getName() + ".zip"); //此处为生成的zip文件的文件名 //File zipFile = new File("D:/" + "aaa" + ".zip"); //这样就将生成的zip文件改名了 System.out.println("Creat: D:/" + myDir.getName() + ".zip"); //调试用 FileOutputStream fos = new FileOutputStream(zipFile); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(fos,BUFFER)); //ZipOutputStream out = new ZipOutputStream(fos); //这么写也行,只是就不用缓冲文件了 File dirContents[] = myDir.listFiles(); File tempFile = null; try{ for(int i = 0;i < dirContents.length;i++){ if(dirContents[i].isDirectory()){ tempFile = ZipSubdirectory(dirContents[i]); //这里就是个递归,因为是递归,所以子目录也被单独压缩了,当然,子目录的子目录也是 flag = true; //需要注意的是,这里进入递归之后,返回的tempFile是*.zip } else{ tempFile = dirContents[i]; flag = false; } System.out.println("Compress file:" + tempFile.getName()); //打印压缩内容信息,如果递归了,那么就压缩一个目录(也就是将.zip作为一个内容放入父目录) FileInputStream fis = new FileInputStream(tempFile); origin = new BufferedInputStream(fis,BUFFER); ZipEntry entry = new ZipEntry(tempFile.getName()); //为被读取的文件创建压缩条目,否则只有目录,目录内无文件 byte[] data = new byte[BUFFER]; int count; out.putNextEntry(entry); //在向ZIP输出流写入数据之前,必须首先使用out.putNextEntry(entry); 方法安置压缩条目对象 while((count = origin.read(data,0,BUFFER)) != -1){ out.write(data,0,count); } origin.close(); if(flag == true){ //这段语句删除tempFile目录失败,可能是没有关闭此文件的流 flag = tempFile.delete(); //如果是目录,会在D:/下又新建一个.zip,所以要删除 System.out.println("Delete file:"+tempFile.getName()+flag); } //origin.close(); //关闭缓冲流要是放在这,会导致上面这段语句执行失败 } out.close(); }catch(Exception e){ System.out.println(e); } return zipFile; } }
这里对以上程序做个简要说明:
首先里面最重要的主体,ZipSubdirectory()方法是一个带返回值(返回类型为File,返回zipFile,具体作用看递归内容)的带参数(参数类型也为File)的方法,其中使用了递归来完成对子目录的压缩.
public BufferedOutputStream(OutputStream out,int size)是一个字节缓冲输出流,该方法实现创建给定大小输出缓冲区的缓冲字节输出流.
public ZipEntry(String name)name为指定的数据项名.
在向ZIP输出流写入数据之前,必须首先使用out.putNextEntry(entry) 方法安置压缩条目对象
解压缩代码
package test4; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; //import org.apache.tools.zip.*; public class Test { public static void main(String[] args) { readFileAndWriteZip(); unZipFile(); } public static void unZipFile() { try{ //int BUFFER = 1024; int BUFFER = 1024; BufferedOutputStream dest = null; FileInputStream fis = new FileInputStream("D:/2M.zip"); ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); //ZipFile zis = new ZipFile(new BufferedInputStream(fis)); ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { System.out.println("Extracting: " + entry); int count; // byte data[] = new byte[1024]; byte data[] = new byte[1024]; FileOutputStream fos = new FileOutputStream("D:/Ta/"+entry.getName()); dest = new BufferedOutputStream(fos, BUFFER); while ((count = zis.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, count); } dest.flush(); dest.close(); } zis.close(); } catch (Exception e) { e.printStackTrace(); } } public static void readFileAndWriteZip() { try { } catch (Exception ex){ System.err.println(ex.toString()); } } }
相关推荐
JAVA压缩文件代码 HUFFMAN函数的压缩代码
java批量压缩文件跟文件夹,目前还不支持中文名,后期会改进,谢谢
java代码实现单个或多个文件压缩成rar包,本地要安装winRar插件。
// 设置压缩文件入口entry,为被读取的文件创建压缩条目 File tempFile = new File(fileArray[i].toString()); String rootStr = file.getPath(); String entryStr = null; // entry以相对路径的...
java压缩文件成zip实现无乱码 内置类与jar包
java压缩文件的程序代码,可以压缩单个文件夹,单个标准文件,多个标准文件 多个文件夹,以及文件夹和文件混合的压缩代码
工具类中提供的方法有:压缩单个文件,压缩多个文件,解压文件到制定路径下。获取压缩文件的文件列表。压缩文件的文件注释。
Java把文件压缩成zip,粘贴在项目中即可使用
java 版的文件分割压缩 可以对大文件进行拆分。 文件大小可定义
java压缩解压文件
压缩文件方法 该方法需要引用zip4j的jar文件 单个文件、多个文件压缩 /** * 使用给定密码压缩指定文件或文件夹到指定位置. * * dest可传最终压缩文件存放的绝对路径,也可以传存放目录,也可以传null或者""....
应用java来压缩需要打包的文件,在系统管理中将毛哥路径或者某个文件夹压缩成zip包
JAVA压缩解压JAVA压缩解压JAVA压缩解压JAVA压缩解压JAVA压缩解压
2、指定文件夹(文件夹中必须有一个文件),程序会自动的压缩文件为 zip,然后下载删除源文件与压缩文件。 3、可以指定文件都为最后生成为zip文件下载,且删除源文件。 1、压缩文件或者目录(只是压缩不删除):...
java压缩文件及解压的算法。方法使用见main函数
zip 压缩 文件 Java zip 压缩 文件 Java zip 压缩 文件 Java zip 压缩 文件 Java
//文件数据(待压缩文件) JButton jbAdd; //增加文件按钮 JButton jbDelete; //删除文件按钮 JButton jbZip; //压缩按钮 JTextField target; //目标文件文本域 public ZipDemo(){ super("用ZIP...
JAVA文件压缩与解压缩实践,java解压缩zip文件,Java源码
JAVA文件压缩与解压缩实践(源代码+论文)