Robert Jansen created COMPRESS-291:
--------------------------------------

             Summary: decompress .7z archive very very slow
                 Key: COMPRESS-291
                 URL: https://issues.apache.org/jira/browse/COMPRESS-291
             Project: Commons Compress
          Issue Type: Improvement
          Components: Compressors
    Affects Versions: 1.9
         Environment: Windows 7 x64, jdk1.7.0_21 x64
            Reporter: Robert Jansen
            Priority: Minor


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;
        }





--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to