解缩文件 zipFile支持中文

来源:互联网 发布:oracle数据库无法连接 编辑:程序博客网 时间:2024/06/07 03:24

使用Java自带的类 java.util.zip进行文件/目录的压缩的话,有一点不足,不支持中文的名件/目录命名,如果有中文名,那么打包就会失败。本人经过一段时间的摸索和实践,发现在一般的Ant.jar类库中也有zip类,import org.apache.tools.zip.*,能够解决不支持中文文件目录的问题,同时,Ant的获得途径也比较多,一般的应用服务器中有这个包,实在不行去下载个tomcat5.X,里面也有ant.jar,本人经过测试,可以使用。

 

Java代码 复制代码 收藏代码
  1. import java.io.File;   
  2. import org.apache.tools.zip.ZipOutputStream;   
  3. import java.io.FileInputStream;   
  4. import java.io.FileOutputStream;   
  5. /**  
  6.  *   
  7.  * @author XL  
  8.  *   
  9.  */  
  10. public class Zip04 {   
  11.   
  12.     /**  
  13.      * @param args  
  14.      */  
  15.     public static void main(String[] args) {   
  16.         // 需打包的文件夾  
  17.         String inputFileName = "c:\\tt2";   
  18.         try {   
  19.             zip(inputFileName);   
  20.         } catch (Exception e) {   
  21.             e.printStackTrace();   
  22.         }   
  23.     }   
  24.     public static void zip(String inputFileName) throws Exception {   
  25.         String zipFileName = "c:\\test.zip";// 打包后文件名字  
  26.         System.out.println(zipFileName);   
  27.         zip(zipFileName, new File(inputFileName));   
  28.     }   
  29.   
  30.     public static void zip(String zipFileName, File inputFile) throws Exception {   
  31.         ZipOutputStream out = new ZipOutputStream(new FileOutputStream(   
  32.                 zipFileName));   
  33.         zip(out, inputFile, "");   
  34.         System.out.println("zip done");   
  35.         out.close();   
  36.     }   
  37.   
  38.     public static void zip(ZipOutputStream out, File f, String base)   
  39.             throws Exception {   
  40.         if (f.isDirectory()) {   
  41.             File[] fl = f.listFiles();   
  42.             out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));   
  43.             base = base.length() == 0 ? "" : base + "/";   
  44.             for (int i = 0; i < fl.length; i++) {   
  45.                 zip(out, fl[i], base + fl[i].getName());   
  46.             }   
  47.         } else {   
  48.             out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));   
  49.             FileInputStream in = new FileInputStream(f);   
  50.             int b;   
  51.             System.out.println(base);   
  52.             while ((b = in.read()) != -1) {   
  53.                 out.write(b);   
  54.             }   
  55.             in.close();   
  56.         }   
  57.     }   
  58. }  

 

类ZipInputStream读出ZIP文件序列(简单地说就是读出这个ZIP文件压缩了多少文件),而类ZipFile使用内嵌的随机文件访问机制读出其中的文件内容,所以不必顺序的读出ZIP压缩文件序列。
  
ZipInputStream和ZipFile之间另外一个基本的不同点在于高速缓冲的使用方面。当文件使用ZipInputStream和FileInputStream流读出的时候,ZIP条目不使用高速缓冲。然而,如果使用ZipFile(文件名)来打开文件,它将使用内嵌的高速缓冲,所以如果ZipFile(文件名)被重复调用的话,文件只被打开一次。缓冲值在第二次打开时使用。如果你工作在UNIX系统下,这是什么作用都没有的,因为使用ZipFile打开的所有ZIP文件都在内存中存在映射,所以使用ZipFile的性能优于ZipInputStream。然而,如果同一ZIP文件的内容在程序执行期间经常改变,或是重载的话,使用ZipInputStream就成为你的首选了。

    下面显示了使用类ZipFile来解压一个ZIP文件的过程:

  1. 通过指定一个被读取的ZIP文件,或者是文件名,或者是一个文件对象来创建一个ZipFile对象:

    Java代码 复制代码 收藏代码
    1. ZipFile zipfile = new ZipFile("figs.zip");   
  2. 使用entries方法,返回一个枚举对象,循环获得文件的ZIP条目对象:

    Java代码 复制代码 收藏代码
    1. while(e.hasMoreElements()) {    
    2.     entry = (ZipEntry) e.nextElement();    
    3.     // read contents and save them   
    4. }  
  3. ZIP条目作为参数传递给getInputStream方法,可以读取ZIP文件中指定条目的内容,能过其返回的输入流(InputStram)对象可以方便的读出ZIP条目的内容:

    Java代码 复制代码 收藏代码
    1. is = new BufferedInputStream(zipfile.getInputStream(entry));   
  4. 获取ZIP条目的文件名,创建输出流,并保存:

    Java代码 复制代码 收藏代码
    1. byte data[] = new byte[BUFFER];    
    2. FileOutputStream fos = new FileOutputStream(entry.getName());    
    3. dest = new BufferedOutputStream(fos, BUFFER);    
    4. while ((count = is.read(data, 0, BUFFER)) != -1) {    
    5.     dest.write(data, 0, count);    
    6. }   
  5. 最后关闭所有的输入输出流

    Java代码 复制代码 收藏代码
    1. dest.flush();    
    2. dest.close();    
    3. is.close();   


完整代码:

Java代码 复制代码 收藏代码
  1. public class UnZip2 {   
  2.     static final int BUFFER = 2048;   
  3.     public static void main(String argv[]) {   
  4.         String fileName = "c:/testlog.zip";   
  5.         String unZipDir = "c:/2/2/";   
  6.         unZip(fileName, unZipDir);   
  7.     }   
  8.   
  9.     public static void unZip(String fileName, String unZipDir) {   
  10.   
  11.         try {   
  12.             // 先判断目标文件夹是否存在,如果不存在则新建,如果父目录不存在也新建  
  13.             File f = new File(unZipDir);   
  14.             if (!f.exists()) {   
  15.                 f.mkdirs();   
  16.             }   
  17.   
  18.             BufferedOutputStream dest = null;   
  19.             BufferedInputStream is = null;   
  20.             ZipEntry entry;   
  21.             ZipFile zipfile = new ZipFile(fileName);   
  22.             Enumeration e = zipfile.entries();   
  23.             while (e.hasMoreElements()) {   
  24.                 entry = (ZipEntry) e.nextElement();   
  25.                 System.out.println("Extracting: " + entry);   
  26.                 is = new BufferedInputStream(zipfile.getInputStream(entry));   
  27.                 int count;   
  28.                 byte data[] = new byte[BUFFER];   
  29.                 FileOutputStream fos = new FileOutputStream(unZipDir + "/"  
  30.                         + entry.getName());   
  31.                 System.out.println("entry.getName(): " + entry.getName());   
  32.                 dest = new BufferedOutputStream(fos, BUFFER);   
  33.                 while ((count = is.read(data, 0, BUFFER)) != -1) {   
  34.                     dest.write(data, 0, count);   
  35.                 }   
  36.                 dest.flush();   
  37.                 dest.close();   
  38.                 is.close();   
  39.             }   
  40.         } catch (Exception e) {   
  41.             e.printStackTrace();   
  42.         }   
  43.     }   
  44.   
  45.     public static boolean makeDir(String unZipDir) {   
  46.         boolean b = false;   
  47.         try {   
  48.             File f = new File(unZipDir);   
  49.             if (!f.exists()) {   
  50.                 b = f.mkdirs();   
  51.             }   
  52.         } catch (Exception e) {   
  53.             e.printStackTrace();   
  54.             return b;   
  55.         }   
  56.         return b;   
  57.     }   
  58. }  

首先我们实现最简单的解压缩zip文件,该zip文件中不包含文件夹,也不含中文名。

Java代码 复制代码 收藏代码
  1. /**  
  2.  * <pre>  
  3.  * 参考:  
  4.  *  http://www.ibm.com/developerworks/cn/java/l-compress/index.html 
  5.  * </pre>  
  6.  */  
  7. import java.io.BufferedInputStream;   
  8. import java.io.BufferedOutputStream;   
  9. import java.io.File;   
  10. import java.io.FileInputStream;   
  11. import java.io.FileOutputStream;   
  12. import java.util.zip.ZipEntry;   
  13. import java.util.zip.ZipInputStream;   
  14.   
  15. public class UnZip {   
  16.     /** 定义一个2K的缓冲区 */  
  17.     static final int BUFFER = 2048;   
  18.   
  19.     public static void main(String[] args) {   
  20.         String fileName = "c:/testlog.zip";   
  21.         // String unZipDir = "c:/abcd/abcd/abcd/abcd/abcd/";  
  22.         String unZipDir = "c:/1/2/";   
  23.         unZip(fileName, unZipDir);   
  24.         // System.out.println(makeDir(unZipDir));  
  25.     }   
  26.   
  27.     /**  
  28.      * @param fileName 
  29.      *            String 待解压缩的文件名 
  30.      * @param unZipDir 
  31.      *            String 存放解压缩后生成的文件的文件夹 
  32.      */  
  33.     public static void unZip(String fileName, String unZipDir) {   
  34.         try {   
  35.   
  36.             // 先判断目标文件夹是否存在,如果不存在则新建,如果父目录不存在也新建  
  37.             File f = new File(unZipDir);   
  38.             if (!f.exists()) {   
  39.                 f.mkdirs();   
  40.             }   
  41.   
  42.             BufferedOutputStream dest = null;   
  43.   
  44.             // 将用文件输入流读入ZIP文件  
  45.             FileInputStream fis = new FileInputStream(fileName);   
  46.             // 类ZipInputStream读取ZIP文件  
  47.             ZipInputStream zis = new ZipInputStream(   
  48.                     new BufferedInputStream(fis));   
  49.             ZipEntry entry;   
  50.             String newFileName = "";   
  51.             // ZIP输入流打开后,你可以使用getNextEntry方法来读取ZIP文件中的条目数,  
  52.             // 该方法返回一个ZipEntry对象。如果到达文件的尾部,getNextEntry返回null  
  53.             while ((entry = zis.getNextEntry()) != null) {   
  54.                 System.out.println("Extracting: " + entry);   
  55.                 int count;   
  56.                 byte data[] = new byte[BUFFER];   
  57.                 // write the files to the disk  
  58.                 newFileName = unZipDir + "/" + entry.getName();   
  59.                 System.out.println("newFileName: " + newFileName);   
  60.                 FileOutputStream fos = new FileOutputStream(newFileName);   
  61.                 dest = new BufferedOutputStream(fos, BUFFER);   
  62.                 while ((count = zis.read(data, 0, BUFFER)) != -1) {   
  63.                     dest.write(data, 0, count);   
  64.                 }   
  65.                 dest.flush();   
  66.                 dest.close();   
  67.             }   
  68.             zis.close();   
  69.         } catch (Exception e) {   
  70.             e.printStackTrace();   
  71.         }   
  72.     }   
  73.   
  74.     public static boolean makeDir(String unZipDir) {   
  75.         boolean b = false;   
  76.         try {   
  77.             File f = new File(unZipDir);   
  78.             if (!f.exists()) {   
  79.                 b = f.mkdirs();   
  80.             }   
  81.         } catch (Exception e) {   
  82.             e.printStackTrace();   
  83.             return b;   
  84.         }   
  85.         return b;   
  86.     }   
  87. }  

 

原创粉丝点击