Decompress files with .7z extension in java

后端 未结 1 1330
南方客
南方客 2020-12-21 00:14

Can someone advice (give example) any appropriate and understandable way how to extract file or files with .7z extension basing upon InputStream. I have been examined the XZ

相关标签:
1条回答
  • 2020-12-21 00:15

    This code might help you.

        import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.util.Arrays;
    
    import net.sf.sevenzipjbinding.ExtractOperationResult;
    import net.sf.sevenzipjbinding.ISequentialOutStream;
    import net.sf.sevenzipjbinding.ISevenZipInArchive;
    import net.sf.sevenzipjbinding.SevenZip;
    import net.sf.sevenzipjbinding.SevenZipException;
    import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream;
    import net.sf.sevenzipjbinding.simple.ISimpleInArchive;
    import net.sf.sevenzipjbinding.simple.ISimpleInArchiveItem;
    
    public class unzip {
        public static void main(String[] args) {
    
            RandomAccessFile randomAccessFile = null;
            ISevenZipInArchive inArchive = null;
    
            try {
                randomAccessFile = new RandomAccessFile("oclHashcat-plus-0.14.7z", "r");
                inArchive = SevenZip.openInArchive(null, // autodetect archive type
                        new RandomAccessFileInStream(randomAccessFile));
    
                // Getting simple interface of the archive inArchive
                ISimpleInArchive simpleInArchive = inArchive.getSimpleInterface();
    
                System.out.println("   Hash   |    Size    | Filename");
                System.out.println("----------+------------+---------");
    
                for (final ISimpleInArchiveItem item : simpleInArchive.getArchiveItems()) {
                    final int[] hash = new int[] { 0 };
                    if (!item.isFolder()) {
                        ExtractOperationResult result;
    
                        final long[] sizeArray = new long[1];
                        result = item.extractSlow(new ISequentialOutStream() {
                            public int write(byte[] data) throws SevenZipException {
    
                                //Write to file
                                FileOutputStream fos;
                                try {
                                    File file = new File(item.getPath());
                                    file.getParentFile().mkdirs();
                                    fos = new FileOutputStream(file);
                                    fos.write(data);
                                    fos.close();
    
                                } catch (FileNotFoundException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
    
                                hash[0] ^= Arrays.hashCode(data); // Consume data
                                sizeArray[0] += data.length;
                                return data.length; // Return amount of consumed data
                            }
                        });
                        if (result == ExtractOperationResult.OK) {
                            System.out.println(String.format("%9X | %10s | %s", // 
                                    hash[0], sizeArray[0], item.getPath()));
                        } else {
                            System.err.println("Error extracting item: " + result);
                        }
                    }
                }
            } catch (Exception e) {
                System.err.println("Error occurs: " + e);
                System.exit(1);
            } finally {
                if (inArchive != null) {
                    try {
                        inArchive.close();
                    } catch (SevenZipException e) {
                        System.err.println("Error closing archive: " + e);
                    }
                }
                if (randomAccessFile != null) {
                    try {
                        randomAccessFile.close();
                    } catch (IOException e) {
                        System.err.println("Error closing file: " + e);
                    }
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题