5 Replies Latest reply: Apr 26, 2010 8:27 PM by EJP RSS

    Create Zip File In Windows and Extract Zip File In Linux

    807580
      I had created a zip file (together with directory) under Windows as follow (Code are picked from [http://www.exampledepot.com/egs/java.util.zip/CreateZip.html|http://www.exampledepot.com/egs/java.util.zip/CreateZip.html] ) :
      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);

      // 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();
      }

      }

      }
      The newly created zip file can be extracted without problem under Windows, by using  [http://www.exampledepot.com/egs/java.util.zip/GetZip.html|http://www.exampledepot.com/egs/java.util.zip/GetZip.html] 
      
      However, I realize if I extract the newly created zip file under Linux, using modified version of  [http://www.exampledepot.com/egs/java.util.zip/GetZip.html|http://www.exampledepot.com/egs/java.util.zip/GetZip.html] . The original version doesn't check for directory using 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" instead of MyFile.txt being placed under folder MyDirectory.*
      
      I try to solve the problem by changing the zip file creation code to
      
      +String[] filenames = new String[]{"MyDirectory" + "/" + "MyFile.txt"};+
      
      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/s To be honest, I do a cross post at  [http://stackoverflow.com/questions/2549766/create-zip-file-in-windows-and-extract-zip-file-in-linux|http://stackoverflow.com/questions/2549766/create-zip-file-in-windows-and-extract-zip-file-in-linux] Just want to get more opinion on this.
      
      Edited by: yccheok on Apr 26, 2010 11:41 AM