2011-09-20 50 views
25

Cách nén và giải nén các tệp đã có trong DDMS: data/data/mypackage/files/ Tôi cần một ví dụ đơn giản cho điều đó. Tôi đã tìm kiếm liên quan đến zip và giải nén. Nhưng, không có ví dụ nào cho tôi. Bất cứ ai có thể nói một số ví dụ. Cảm ơn trước.Cách nén và giải nén tệp?

+1

Hãy xem tại đây: http://www.jondev.net/articles/Zipping_Files_with_Android_(Programmatically), trên trang đầu tiên khi tìm kiếm "android cách zip tệp" trên Google. – nhaarman

Trả lời

55

Hãy xem các lớp java.util.zip. * Cho chức năng zip. Tôi đã thực hiện một số mã zip/giải nén cơ bản mà tôi đã dán bên dưới. Hy vọng nó giúp.

public static void zip(String[] files, String zipFile) throws IOException { 
    BufferedInputStream origin = null; 
    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile))); 
    try { 
     byte data[] = new byte[BUFFER_SIZE]; 

     for (int i = 0; i < files.length; i++) { 
      FileInputStream fi = new FileInputStream(files[i]);  
      origin = new BufferedInputStream(fi, BUFFER_SIZE); 
      try { 
       ZipEntry entry = new ZipEntry(files[i].substring(files[i].lastIndexOf("/") + 1)); 
       out.putNextEntry(entry); 
       int count; 
       while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) { 
        out.write(data, 0, count); 
       } 
      } 
      finally { 
       origin.close(); 
      } 
     } 
    } 
    finally { 
     out.close(); 
    } 
} 

public static void unzip(String zipFile, String location) throws IOException { 
    try { 
     File f = new File(location); 
     if(!f.isDirectory()) { 
      f.mkdirs(); 
     } 
     ZipInputStream zin = new ZipInputStream(new FileInputStream(zipFile)); 
     try { 
      ZipEntry ze = null; 
      while ((ze = zin.getNextEntry()) != null) { 
       String path = location + ze.getName(); 

       if (ze.isDirectory()) { 
        File unzipFile = new File(path); 
        if(!unzipFile.isDirectory()) { 
         unzipFile.mkdirs(); 
        } 
       } 
       else { 
        FileOutputStream fout = new FileOutputStream(path, false); 
        try { 
         for (int c = zin.read(); c != -1; c = zin.read()) { 
          fout.write(c); 
         } 
         zin.closeEntry(); 
        } 
        finally { 
         fout.close(); 
        } 
       } 
      } 
     } 
     finally { 
      zin.close(); 
     } 
    } 
    catch (Exception e) { 
     Log.e(TAG, "Unzip exception", e); 
    } 
} 
+0

Không hiệu quả với tôi. Sticks trong vòng lặp vô hạn. – usman

+0

Điều này là sai: 'Chuỗi đường dẫn = vị trí + ze.getName(); nếu (ze.isDirectory()) { Tệp unzipFile = new File (đường dẫn); nếu (! UnzipFile.isDirectory()) { unzipFile.mkdirs(); } } ' – maohieng

+0

giá trị của biến kích thước bộ đệm là gì? –

45

Chức năng zip brianestey được cung cấp hoạt động tốt, nhưng chức năng giải nén rất chậm do đọc từng byte một lần. Đây là một phiên bản sửa đổi của hàm unzip của anh ta, sử dụng bộ đệm và nhanh hơn nhiều.

/** 
* Unzip a zip file. Will overwrite existing files. 
* 
* @param zipFile Full path of the zip file you'd like to unzip. 
* @param location Full path of the directory you'd like to unzip to (will be created if it doesn't exist). 
* @throws IOException 
*/ 
public static void unzip(String zipFile, String location) throws IOException { 
    int size; 
    byte[] buffer = new byte[BUFFER_SIZE]; 

    try { 
     if (!location.endsWith(File.separator)) { 
      location += File.separator; 
     } 
     File f = new File(location); 
     if(!f.isDirectory()) { 
      f.mkdirs(); 
     } 
     ZipInputStream zin = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFile), BUFFER_SIZE)); 
     try { 
      ZipEntry ze = null; 
      while ((ze = zin.getNextEntry()) != null) { 
       String path = location + ze.getName(); 
       File unzipFile = new File(path); 

       if (ze.isDirectory()) { 
        if(!unzipFile.isDirectory()) { 
         unzipFile.mkdirs(); 
        } 
       } else { 
        // check for and create parent directories if they don't exist 
        File parentDir = unzipFile.getParentFile(); 
        if (null != parentDir) { 
         if (!parentDir.isDirectory()) { 
          parentDir.mkdirs(); 
         } 
        } 

        // unzip the file 
        FileOutputStream out = new FileOutputStream(unzipFile, false); 
        BufferedOutputStream fout = new BufferedOutputStream(out, BUFFER_SIZE); 
        try { 
         while ((size = zin.read(buffer, 0, BUFFER_SIZE)) != -1) { 
          fout.write(buffer, 0, size); 
         } 

         zin.closeEntry(); 
        } 
        finally { 
         fout.flush(); 
         fout.close(); 
        } 
       } 
      } 
     } 
     finally { 
      zin.close(); 
     } 
    } 
    catch (Exception e) { 
     Log.e(TAG, "Unzip exception", e); 
    } 
} 
+2

Giải nén này không hoạt động đối với tôi. Tôi đã nhận được lỗi vì nó đã cố gắng giải nén một tệp trước thư mục mẹ của nó. Trong câu lệnh khác tôi đã thêm một điều kiện để tạo thư mục cha nếu nó không tồn tại. Bây giờ nó hoạt động. –

+0

@ J-L Cảm ơn bạn đã chỉ ra điều đó. Tôi đã chỉnh sửa mã cho phù hợp. – Ben

+0

nhanh và công việc gr8, BUFFER_SIZE = 8192 –

Các vấn đề liên quan