java解压缩

  1. Java实现Zip压缩解压可以使用JDK的原生类java.util.zip,但是JDK 7 之前存在中文文件名乱码问题。
  2. 使用 ant.jar 的org.apache.tools.zip包,可以避免乱码问题。
  3. 使用专门的压缩解压第三方组件,如zip4j,zt-zip等,这种实现方式当然更强大,不过一般场景用不到,如果只是压缩解压第2种方式足够了。
然而第三种是最简单的哈哈
下面是zt_zip的介绍。
可以看下git:https://github.com/zeroturnaround/zt-zip
也可以看下下面的讲解
 在Java平台上有很多官方的和非官方、第三方的压缩工具包,它们各有各的长处,比如Oracle官方的java.util.zip 类库,Apache网站上的Apache Commons Compress 类库,或者Chilkat Java Zip 类库,但总体说来,这些类库提供都是低级别的API,操作起来都不是很方便,而今天推荐给大家的这个叫做ZeroTurnaround(简称zt-zip)的压缩类库的特点就是方便、简易,我们可以比较一下,如果用标准的Java类库压缩一个目录里的所有文件,你需要写出的代码大概是这样:
[java]  view plain  copy
 print ?
  1. File dir = new File("demo");  
  2. ZipOutputStream out = new ZipOutputStream(new FileOutputStream("demo.zip"));  
  3. try {  
  4.   File[] files = dir.listFiles();  
  5.   for (int i = 0; i < files.length; i++) {  
  6.     File file = files[i];  
  7.     ZipEntry entry = new ZipEntry(file.getName());  
  8.     entry.setSize(file.length());  
  9.     entry.setTime(file.lastModified());  
  10.     out.putNextEntry(entry);  
  11.     FileInputStream in = new FileInputStream(file);  
  12.     try {  
  13.       IOUtils.copy(in, out);  
  14.     }  
  15.     finally {  
  16.       IOUtils.closeQuietly(in);  
  17.     }  
  18.     out.closeEntry();  
  19.    }  
  20.  } finally {  
  21.    IOUtils.closeQuietly(out);  
  22. }  


    而使用 zt-zip 工具包,你的代码就变成了只有一行:

[java]  view plain  copy
 print ?
  1. ZipUtil.pack(new File("demo"), new File("demo.zip"));  


  你不需要自己去关闭文件的数据流,这个类库的接口自动替你你做了这些。

  可能经常做Java压缩编程的人会提到另外一个压缩类库:TrueZIP,这也是一个非常好的类库,而zt-zip跟它比起来的一个优势是:消耗内存很少,这是因为TrueZIP大量的使用了虚拟机的堆内存,而zt-zip却是只是以数据流的形式进行操作,当然这也是zt-zip的API提供的功能很有针对性、不是TrueZIP API那样通用的原因。

  你可以在Github上下载这个类库。

 

Examples

[java]  view plain  copy
 print ?
  1. //Unpacking  
  2.   
  3. //Check if an entry exists in a ZIP archive  
  4. boolean exists = ZipUtil.containsEntry(new File("/tmp/demo"), "foo.txt");  
  5. //Extract an entry from a ZIP archive into a byte array  
  6. byte[] bytes = ZipUtil.unpackEntry(new File("/tmp/demo.zip"), "foo.txt");  
  7. //Extract an entry from a ZIP archive into file system  
  8. ZipUtil.unpackEntry(new File("/tmp/demo.zip"), "foo.txt"new File("/tmp/bar.txt"));  
  9. //Extract a ZIP archive  
  10. ZipUtil.unpack(new File("/tmp/demo.zip"), new File("/tmp/demo"));  
  11. //Extract a ZIP archive which becomes a directory  
  12. ZipUtil.explode(new File("/tmp/demo.zip"));  
  13. //Extract a directory from a ZIP archive including the directory name  
  14. ZipUtil.unpack(new File("/tmp/demo.zip"), new File("/tmp/demo"), new NameMapper() {  
  15.   public String map(String name) {  
  16.     return name.startsWith("doc/") ? name : null;  
  17.   }  
  18. });  
  19. //Extract a directory from a ZIP archive excluding the directory name  
  20. final String prefix = "doc/";   
  21. ZipUtil.unpack(new File("/tmp/demo.zip"), new File("/tmp/demo"), new NameMapper() {  
  22.   public String map(String name) {  
  23.     return name.startsWith(prefix) ? name.substring(prefix.length()) : name;  
  24.   }  
  25. });  
  26. //Print .class entry names in a ZIP archive  
  27. ZipUtil.iterate(new File("/tmp/demo.zip"), new ZipInfoCallback() {  
  28.   public void process(ZipEntry zipEntry) throws IOException {  
  29.     if (zipEntry.getName().endsWith(".class"))  
  30.       System.out.println("Found " + zipEntry.getName());  
  31.   }  
  32. });  
  33. //Print .txt entries in a ZIP archive (uses IoUtils from Commons IO)  
  34. ZipUtil.iterate(new File("/tmp/demo.zip"), new ZipEntryCallback() {  
  35.   public void process(InputStream in, ZipEntry zipEntry) throws IOException {  
  36.     if (zipEntry.getName().endsWith(".txt")) {  
  37.       System.out.println("Found " + zipEntry.getName());  
  38.       IOUtils.copy(in, System.out);  
  39.     }  
  40.   }  
  41. });  


 

[java]  view plain  copy
 print ?
  1. //Packing  
  2.   
  3. //Compress a directory into a ZIP archive  
  4. ZipUtil.pack(new File("/tmp/demo"), new File("/tmp/demo.zip"));  
  5. //Compress a directory which becomes a ZIP archive  
  6. ZipUtil.unexplode(new File("/tmp/demo.zip"));  
  7. //Compress a directory into a ZIP archive with a parent directory  
  8. ZipUtil.pack(new File("/tmp/demo"), new File("/tmp/demo.zip"), new NameMapper() {  
  9.   public String map(String name) {  
  10.     return "foo/" + name;  
  11.   }  
  12. });  
  13. //Add an entry from file to a ZIP archive  
  14. ZipUtil.addEntry(new File("/tmp/demo.zip"), "doc/readme.txt"new File("f/tmp/oo.txt"), new File("/tmp/new.zip"));  
  15. //Add an entry from byte array to a ZIP archive  
  16. ZipUtil.addEntry(new File("/tmp/demo.zip"), "doc/readme.txt""bar".getBytes(), new File("/tmp/new.zip"));  
  17. //Add an entry from file and from byte array to a ZIP archive  
  18. ZipEntrySource[] entries = new ZipEntrySource[] {  
  19.     new FileSource("doc/readme.txt"new File("foo.txt")),  
  20.     new ByteSource("sample.txt""bar".getBytes())  
  21. };  
  22. ZipUtil.addEntries(new File("/tmp/demo.zip"), entries, new File("/tmp/new.zip"));  
  23. //Replace a ZIP archive entry from file  
  24. boolean replaced = ZipUtil.replaceEntry(new File("/tmp/demo.zip"), "doc/readme.txt"new File("/tmp/foo.txt"), new File("/tmp/new.zip"));  
  25. //Replace a ZIP archive entry from byte array  
  26. boolean replaced = ZipUtil.replaceEntry(new File("/tmp/demo.zip"), "doc/readme.txt""bar".getBytes(), new File("/tmp/new.zip"));  
  27. //Replace a ZIP archive entry from file and byte array  
  28. ZipEntrySource[] entries = new ZipEntrySource[] {  
  29.     new FileSource("doc/readme.txt"new File("foo.txt")),  
  30.     new ByteSource("sample.txt""bar".getBytes())  
  31. };  
  32. boolean replaced = ZipUtil.replaceEntries(new File("/tmp/demo.zip"), entries, new File("/tmp/new.zip"));  


 

[java]  view plain  copy
 print ?
  1. //Comparison  
  2.   
  3. //Compare two ZIP archives (ignoring timestamps of the entries)  
  4. boolean equals = ZipUtil.archiveEquals(new File("/tmp/demo1.zip"), new File("/tmp/demo2.zip"));  
  5. //Compare two ZIP archive entries with same name (ignoring timestamps of the entries)  
  6. boolean equals = ZipUtil.entryEquals(new File("/tmp/demo1.zip"), new File("/tmp/demo2.zip"), "foo.txt");  
  7. //Compare two ZIP archive entries with different names (ignoring timestamps of the entries)  
  8. boolean equals = ZipUtil.entryEquals(new File("/tmp/demo1.zip"), new File("/tmp/demo2.zip"), "foo1.txt""foo2.txt");  


 

 

注:本文转载自:

http://www.aqee.net/development-tools-zt-zip/

https://github.com/zeroturnaround/zt-zip


你可能感兴趣的:(java解压缩)