Details
-
Improvement
-
Status: Resolved
-
Minor
-
Resolution: Fixed
-
1.9
-
None
-
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 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
- depends upon
-
COMPRESS-333 bz2 stream decompressor is 10x slower than it could be
- Resolved
-
COMPRESS-320 File listing and random access of 7Z files
- Resolved