[ 
https://issues.apache.org/jira/browse/COMPRESS-291?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Stefan Bodewig resolved COMPRESS-291.
-------------------------------------
       Resolution: Fixed
    Fix Version/s: 1.11

we like to believe the combination of COMPRESS-333 and COMPRESS-340 has 
improved the situation considerably.

> 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
>             Fix For: 1.11
>
>
> 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