Java解压缩7z文件

Introduction

新的7z压缩解压文章

感谢群里小伙伴们的讨论,更新下7 zip jbinding的用法。

利用7-zip的开源项目7-zip-JBinding来解压缩多种压缩文件,而不是调用外部命令(比如win下调用winrar)。

java自带的解压模块可解压缩的压缩类型有限。

项目地址(sourceforge)

代码示例


package core;

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.IInArchive;
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;
/**利用7zbinding*/
public class UnZip {


    void extractile(String filepath){
         RandomAccessFile randomAccessFile = null;
            IInArchive inArchive = null;

            try {
                randomAccessFile = new RandomAccessFile(filepath, "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());
                                    //error occours below
//                                  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);
                e.printStackTrace();
                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);
                    }
                }
            }
    }
}

调用的时候:


unzip=new UnZip();
unzip.extractile("a.7z");

会自动解压缩压缩包里的文件到当前目录下,当然可以更改设置,到特定的目录。代码简单明确。有问题可以到上面的sourceforge项目地址下的discuss搜索。

文章版权归 FindHao 所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明作者 FindHao 和本文原始地址:
https://www.findhao.net/easycoding/1057

你可能喜欢:(相似内容推荐和广告都使用了谷歌的推荐系统,需要对本站取消广告屏蔽才能显示。感谢点击↓广告支持博主~)

Find

新浪微博(FindSpace博客)QQ群:不安分的Coder(375670127) 不安分的Coder

6 条回复

  1. 张三说道:

    在走这段:result = item.extractSlow(new ISequentialOutStream() { public int write(byte[] data) throws SevenZipException 代码时,控制台会抛出Error extracting item: UNSUPPORTEDMETHOD异常,解压文件名称为:D:\\aaaa\\10158-patch-F20170217-1525_T20170308-2205-patch003.7z,想知道错误原因

  2. 璐璐说道:

    ISevenZipInArchive 找不到这个类

  1. 2017年10月17日

    […] 两年前因为要在java项目中写一个解压缩的小功能,使用了7zip binding项目,并发了篇博客记录Java解压缩7z文件,没想到后来文章访问量不错,而且在谷歌和百度的搜索结果中,排名都很靠前,尽管更可能的原因是没人在这方面做东西。 […]

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*