2010-03-31 41 views
7

tôi đã tạo ra một file zip (cùng với thư mục) trong môi trường Windows như sau (Mã số được chọn từ http://www.exampledepot.com/egs/java.util.zip/CreateZip.html):Tạo Zip File Trong Windows và Giải nén Zip File Trong Linux

package sandbox; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipOutputStream; 

/** 
* 
* @author yan-cheng.cheok 
*/ 
public class Main { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // These are the files to include in the ZIP file 
     String[] filenames = new String[]{"MyDirectory" + File.separator + "MyFile.txt"}; 

     // Create a buffer for reading the files 
     byte[] buf = new byte[1024]; 

     try { 
      // Create the ZIP file 
      String outFilename = "outfile.zip"; 
      ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename)); 

      // Compress the files 
      for (int i=0; i<filenames.length; i++) { 
       FileInputStream in = new FileInputStream(filenames[i]); 

       // Add ZIP entry to output stream. 
       out.putNextEntry(new ZipEntry(filenames[i])); 

       // Transfer bytes from the file to the ZIP file 
       int len; 
       while ((len = in.read(buf)) > 0) { 
        out.write(buf, 0, len); 
       } 

       // Complete the entry 
       out.closeEntry(); 
       in.close(); 
      } 

      // Complete the ZIP file 
      out.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

Các file zip mới được tạo ra có thể được trích xuất mà không có vấn đề trong Windows, bằng cách sử dụng http://www.exampledepot.com/egs/java.util.zip/GetZip.html

Tuy nhiên, tôi nhận ra nếu tôi trích xuất tệp zip mới được tạo dưới Linux, sử dụng phiên bản sửa đổi http://www.exampledepot.com/egs/java.util.zip/GetZip.html. Phiên bản gốc không kiểm tra thư mục bằng cách sử dụng zipEntry.isDirectory()).

public static boolean extractZipFile(File zipFilePath, boolean overwrite) { 
    InputStream inputStream = null; 
    ZipInputStream zipInputStream = null; 
    boolean status = true; 

    try { 
     inputStream = new FileInputStream(zipFilePath); 

     zipInputStream = new ZipInputStream(inputStream); 
     final byte[] data = new byte[1024]; 

     while (true) { 
      ZipEntry zipEntry = null; 
      FileOutputStream outputStream = null; 

      try { 
       zipEntry = zipInputStream.getNextEntry(); 

       if (zipEntry == null) break; 

       final String destination = Utils.getUserDataDirectory() + zipEntry.getName(); 

       if (overwrite == false) { 
        if (Utils.isFileOrDirectoryExist(destination)) continue; 
       } 

       if (zipEntry.isDirectory()) 
       { 
        Utils.createCompleteDirectoryHierarchyIfDoesNotExist(destination); 
       } 
       else 
       { 
        final File file = new File(destination); 
        // Ensure directory is there before we write the file. 
        Utils.createCompleteDirectoryHierarchyIfDoesNotExist(file.getParentFile()); 

        int size = zipInputStream.read(data); 

        if (size > 0) { 
         outputStream = new FileOutputStream(destination); 

         do { 
          outputStream.write(data, 0, size); 
          size = zipInputStream.read(data); 
         } while(size >= 0); 
        } 
       } 
      } 
      catch (IOException exp) { 
       log.error(null, exp); 
       status = false; 
       break; 
      } 
      finally { 
       if (outputStream != null) { 
        try { 
         outputStream.close(); 
        } 
        catch (IOException exp) { 
         log.error(null, exp); 
         break; 
        } 
       } 

       if (zipInputStream != null) { 
        try { 
         zipInputStream.closeEntry(); 
        } 
        catch (IOException exp) { 
         log.error(null, exp); 
         break; 
        } 
       } 
      } 

     } // while(true) 
    } 
    catch (IOException exp) { 
     log.error(null, exp); 
     status = false; 
    } 
    finally { 
     if (zipInputStream != null) { 
      try { 
       zipInputStream.close(); 
      } catch (IOException ex) { 
       log.error(null, ex); 
      } 
     } 

     if (inputStream != null) { 
      try { 
       inputStream.close(); 
      } catch (IOException ex) { 
       log.error(null, ex); 
      } 
     } 
    } 
    return status; 
} 

"MyDirectory \ myfile.txt" thay vì myfile.txt được đặt dưới thư mục MyDirectory.

tôi cố gắng giải quyết vấn đề bằng cách thay đổi mã zip tạo tập tin để

String[] filenames = new String[]{"MyDirectory" + "/" + "MyFile.txt"}; 

Nhưng, đây là một giải pháp đủ điều kiện, bởi mã hóa cứng các seperator? Nó có hoạt động dưới Mac OS không? (Tôi không có máy Mac để thử)

Trả lời

1

Có, giải pháp của bạn (mặc dù dường như không phù hợp) là đúng cách. "/" nên được sử dụng bên trong zipentry, không phải là địa phương File.separator

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