title: Create Zip File In Windows and Extract Zip File In Linux
body: <p>I had created a zip file (together with directory) under Windows as follow (Code are picked from <a href="http://www.exampledepot.com/egs/java.util.zip/CreateZip.html" rel="noreferrer">http://www.exampledepot.com/egs/java.util.zip/CreateZip.html</a>) :</p>
  
  <pre><code>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&lt;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)) &gt; 0) {
                      out.write(buf, 0, len);
                  }
  
                  // Complete the entry
                  out.closeEntry();
                  in.close();
              }
  
              // Complete the ZIP file
              out.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
  
      }
  
  }
  </code></pre>
  
  <p>The newly created zip file can be extracted without problem under Windows, by using <a href="http://www.exampledepot.com/egs/java.util.zip/GetZip.html" rel="noreferrer">http://www.exampledepot.com/egs/java.util.zip/GetZip.html</a></p>
  
  <p>However, I realize if I extract the newly created zip file under Linux, using modified version of <a href="http://www.exampledepot.com/egs/java.util.zip/GetZip.html" rel="noreferrer">http://www.exampledepot.com/egs/java.util.zip/GetZip.html</a>. The original version doesn't check for directory using zipEntry.isDirectory()).</p>
  
  <pre><code>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 &gt; 0) {
                          outputStream = new FileOutputStream(destination);
  
                          do {
                              outputStream.write(data, 0, size);
                              size = zipInputStream.read(data);
                          } while(size &gt;= 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;
  }
  </code></pre>
  
  <p><strong>"MyDirectory\MyFile.txt" instead of MyFile.txt being placed under folder MyDirectory.</strong></p>
  
  <p>I try to solve the problem by changing the zip file creation code to</p>
  
  <pre><code>    String[] filenames = new String[]{"MyDirectory" + "/" + "MyFile.txt"};
  </code></pre>
  
  <p>But, is this an eligible solution, by hard-coded the seperator? Will it work under Mac OS? (I do not have a Mac to try out)</p>