Uploaded image for project: 'Commons Compress'
  1. Commons Compress
  2. COMPRESS-291

decompress .7z archive very very slow

    XMLWordPrintableJSON

    Details

    • Type: Improvement
    • Status: Resolved
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: 1.9
    • Fix Version/s: 1.11
    • Component/s: Compressors
    • Labels:
      None
    • Environment:

      Windows 7 x64, jdk1.7.0_21 x64

      Description

      I have 7z archives with one large image and many small files. The following code decompresses to a directory and returns the largest file. It is glacially slow and not usable for GB size files:

      public File unSevenZipToDir(File sevenZipFile, File outputDir) {

      File imgFile = null;
      // Make sure output dir exists
      outputDir.mkdirs();
      if (outputDir.exists()) {

      //FileInputStream stream;
      try {

      FileOutputStream output = null;
      SevenZFile f7z = new SevenZFile(sevenZipFile);
      SevenZArchiveEntry entry;
      long maxSize = 0;

      while ((entry = f7z.getNextEntry()) != null) {
      if (entry != null) {
      String s = entry.getName();

      if (s != null) {
      long sz = entry.getSize();

      if (sz > 0) {
      int count;
      byte data[] = new byte[4096];

      String outFileName = outputDir.getPath() + "/"
      + new File(entry.getName()).getName();

      File outFile = new File(outFileName);

      // Extract only if it does not already exist
      if (outFile.exists() == false) {
      System.out.println("Extracting " + s + " => size = " + sz);

      FileOutputStream fos = new FileOutputStream(
      outFile);

      BufferedOutputStream dest = new BufferedOutputStream(
      fos);

      while ((count = f7z.read(data)) != -1)

      { dest.write(data, 0, count); }

      dest.flush();
      dest.close();

      } else

      { System.out.println("Using already Extracted " + s + " => size = " + sz); }

      if (s.endsWith(".h5") || s.endsWith(".tif") ||
      s.endsWith(".cos") || s.endsWith(".nitf")

      s.endsWith(".ntf")
      s.endsWith(".jpg") && sz > maxSize) { maxSize = sz; imgFile = new File(outFileName); }

      } // end sz > 0
      } // end s != null

      } // end if entry
      } // end while
      f7z.close();

      } catch (FileNotFoundException e)

      { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }

      }
      return imgFile;
      }

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                Unassigned
                Reporter:
                rjansen Robert Jansen
              • Votes:
                1 Vote for this issue
                Watchers:
                5 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: