Add the dependent

implementation 'org.apache.com mons: the Commons - compress: 1.18'
implementation 'org. Tukaani: xz: 1.8'
Copy the code

Unpack the

    / * * *@paramInCompressFile specifies the 7zip file to be decompressed@paramOutputDir Storage directory for decompressed files *@throws IOException
     */
    public static void unCompress(File inCompressFile, File outputDir) throws IOException {
        if (inCompressFile == null| |! inCompressFile.exists()) {throw new RuntimeException("Invalid outputDir:" + outputDir);
        }
        if (outputDir == null| |! outputDir.exists() || ! outputDir.isDirectory()) { outputDir.mkdirs(); } SevenZFile sevenZFile =new SevenZFile(inCompressFile);
        SevenZArchiveEntry entry = null;
        while((entry = sevenZFile.getNextEntry()) ! =null) {
            String entryName = entry.getName();
            if (entry.isDirectory()) {// //handle dir
                File file = new File(outputDir, entryName);
                file.mkdirs();
                continue;
            }
            int index = entryName.lastIndexOf(File.separator);
            String entryPath = index == -1 ? "" : entryName.substring(0, index);
            File file = new File(outputDir, entryPath);
            if(! file.exists() || ! file.isDirectory()) file.mkdirs(); File newFile =new File(outputDir, entryName);
            OutputStream outputStream = null;

            try {
                outputStream = new FileOutputStream(newFile);
                int len = -1;
                byte[] buffer = new byte[2048];
                while((len = sevenZFile.read(buffer)) ! = -1) {
                    outputStream.write(buffer, 0, len); }}catch (Exception e) {
                e.printStackTrace();
            } finally {
                if(outputStream ! =null) { outputStream.flush(); outputStream.close(); }}}}Copy the code

The compression

    public static void compress(File outputFile, File... inputFiles) throws IOException {
        if (inputFiles.length == 0) {
            throw new RuntimeException("InputFiles is null.");
        }
        for (File inputFile : inputFiles) {
            if(! inputFile.exists()) {throw new RuntimeException("InputFile:" + inputFile.getPath() + "not exists."); }}if(outputFile ! =null && outputFile.exists()) {
            outputFile.delete();
        }

        SevenZOutputFile output = new SevenZOutputFile(outputFile);
        //LZMA2 is default
        //output.setContentCompression(SevenZMethod.LZMA2);
        try {
            for (File inputFile : inputFiles) {
                compress(output, inputFile, null); }}finally{ output.close(); }}private static void compress(SevenZOutputFile output, File inputFile, String name) throws IOException {
        if (name == null) name = inputFile.getName();

        if (inputFile.isDirectory()) {//compress dir
            File[] childFiles = inputFile.listFiles();
            if (childFiles.length == 0) {
                genSingleEntry(output, inputFile, name);
                output.closeArchiveEntry();
            } else {
                for(File file : childFiles) { compress(output, file, name + File.separator + file.getName()); }}}else { //compress single file

            BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(inputFile));
            genSingleEntry(output, inputFile, name);
            int len = -1;
            byte[] buffer = new byte[2048];
            //if item not need compress
            //output.setContentCompression(SevenZMethod.COPY);
            while((len = inputStream.read(buffer)) ! = -1) {
                output.write(buffer, 0, len); } inputStream.close(); output.closeArchiveEntry(); }}private static SevenZArchiveEntry genSingleEntry(SevenZOutputFile output, File file, String entryName) throws IOException {
        SevenZArchiveEntry entry = output.createArchiveEntry(file, entryName);
        output.putArchiveEntry(entry);
        return entry;
    }

Copy the code