2010-03-31 166 views
7

我创造了一个zip文件(目录一起)在Windows下如下(代码从http://www.exampledepot.com/egs/java.util.zip/CreateZip.html采摘):创建Zip文件在Windows和提取Zip文件在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(); 
     } 

    } 

} 

新创建的zip文件可在Windows下解压没有问题,通过使用http://www.exampledepot.com/egs/java.util.zip/GetZip.html

但是,我意识到如果我在Linux下使用http://www.exampledepot.com/egs/java.util.zip/GetZip.html的修改版本提取新创建的zip文件。原始版本不使用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的”,而不是MyFile.txt的被置于文件夹mydirectory中。

我试图通过改变zip文件创建代码,以

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

来解决这个问题,但是,这是一个合格的解决方案,通过硬编码的分隔符?它会在Mac OS下运行吗? (我没有Mac可以试用)

回答

1

是的,您的解决方案(虽然显然不雅)是正确的方法。 的“/”应该被里面的ZipEntry使用,而不是本地文件分割符