java对压缩文件7z、rar、zip的解压

需求,对Spring传递上来的文件进行解压,分析数据,这是解压模块

 <!--apache提供的压缩包依赖-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-compress</artifactId>
            <version>1.9</version>
        </dependency>
        <!--不引入xz依赖会在new SevenZFile的时候报错java.lang.NoClassDefFoundError: org/tukaani/xz/FilterOptions-->
        <dependency>
            <groupId>org.tukaani</groupId>
            <artifactId>xz</artifactId>
            <version>1.9</version>
        </dependency>

        <!--解压rar5,所需依赖开始-->
        <dependency>
            <groupId>com.github.axet</groupId>
            <artifactId>java-unrar</artifactId>
            <version>1.7.0-8</version>
        </dependency>
        <dependency>
            <groupId>net.sf.sevenzipjbinding</groupId>
            <artifactId>sevenzipjbinding</artifactId>
            <version>16.02-2.01</version>
        </dependency>
        <dependency>
            <groupId>net.sf.sevenzipjbinding</groupId>
            <artifactId>sevenzipjbinding-all-platforms</artifactId>
            <version>16.02-2.01</version>
        </dependency>

1、解压RaR

@MethodOperation("解压rar 5版本向下兼容")
public static void unRar(InputStream inputStream, String outPath, String fileName) throws IOException {
    File file = null;
    IInArchive archive = null;
    RandomAccessFile randomAccessFile = null;
    try {
         //将文件流放到一个临时位置后转换为File对象
        String filePath = outPath + File.separator + fileName;
        new File(outPath).mkdirs();
        file = new File(filePath);
        log.info("创建的文件路径:{}", filePath);
        inputStream2File(inputStream, file);

        randomAccessFile = new RandomAccessFile(file, "r");
        archive = SevenZip.openInArchive(null, new RandomAccessFileInStream(randomAccessFile));
        int[] in = new int[archive.getNumberOfItems()];
        for (int i = 0; i < in.length; i++) {
            in[i] = i;
        }
        archive.extract(in, false, new ExtractCallback(archive, outPath));
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (null != archive) {
                archive.close();
            }
            if (null != randomAccessFile) {
                randomAccessFile.close();
            }
            file.deleteOnExit();
            file.delete();
        } catch (Exception e) {
                e.printStackTrace();
         }
        log.info("RAR文件解压成功");
     }
 }
ExtractCallback,引用《https://blog.csdn.net/cxy_zxl/article/details/121508705》
public class ExtractCallback implements IArchiveExtractCallback {

    private int index;
    private IInArchive inArchive;
    private String ourDir;

 public ExtractCallback(IInArchive inArchive, String ourDir) {
     this.inArchive = inArchive;
     this.ourDir = ourDir;
 }

@Override
public void setCompleted(long arg0) throws SevenZipException {
}

@Override
public void setTotal(long arg0) throws SevenZipException {
}

@Override
public ISequentialOutStream getStream(int index, ExtractAskMode extractAskMode) throws SevenZipException {
    this.index = index;
     final String path = (String) inArchive.getProperty(index, PropID.PATH);
     final boolean isFolder = (boolean) inArchive.getProperty(index, PropID.IS_FOLDER);
     final String[] oldPath = {""};
     return new ISequentialOutStream() {
          public int write(byte[] data) throws SevenZipException {
             try {
                if (!isFolder) {
                        File file = new File(ourDir + File.separator + path);
                        if (path.equals(oldPath[0])) {
                            save2File(file, data, true);
                        } else {
                            save2File(file, data, false);
                        }
                        oldPath[0] = path;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return data.length;
            }
        };


    }

@Override
public void prepareOperation(ExtractAskMode arg0) throws SevenZipException {
}

@Override
public void setOperationResult(ExtractOperationResult extractOperationResult) throws SevenZipException {

}


    /**
     * 解决字节丢失  未验证
     *
     * @param file
     * @param msg
     * @param append
     * @return
     */
public boolean save2File(File file, byte[] msg, boolean append) {
        OutputStream fos = null;
        try {
            File parent = file.getParentFile();
            boolean bool;
            if ((!parent.exists()) && (!parent.mkdirs())) {
                return false;
            }
            //是否追加
            fos = new FileOutputStream(file, append);
            fos.write(msg);
            fos.flush();
            return true;
        } catch (FileNotFoundException e) {
            return false;
        } catch (IOException e) {
            File parent;
            return false;
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                }
            }
        }
    }

public static boolean save2File(File file, byte[] msg) {
        OutputStream fos = null;
        try {
            File parent = file.getParentFile();
            if ((!parent.exists()) && (!parent.mkdirs())) {
                return false;
            }
            fos = new FileOutputStream(file, true);
            fos.write(msg);
            fos.flush();
            return true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}

2、解压7Z

@MethodOperation("解析本地7z文件")
public static void un7z(InputStream inputStream, String outPath, String fileName) {
        SevenZFile sevenZFile = null;
        File tempfile = null;
        try {
            //将文件流放到一个临时位置后转换为File对象
            new File(outPath).mkdirs();
            tempfile = new File(outPath + File.separator + fileName);
            inputStream2File(inputStream, tempfile);

            //获取对象
            sevenZFile = new SevenZFile(tempfile);
            SevenZArchiveEntry nextEntry = null;
            while ((nextEntry = sevenZFile.getNextEntry()) != null) {
                File file = new File(outPath + File.separator + nextEntry.getName());
                if (nextEntry.isDirectory()) {
                    file.mkdir();
                    continue;
                }
                fileOutput(file, sevenZFile, nextEntry);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                closeInputStream(inputStream);
                if (null != sevenZFile) {
                    sevenZFile.close();
                }
                //删除临时文件
                tempfile.deleteOnExit();
                tempfile.delete();
            } catch (Exception e) {

            }
            log.info("7Z文件解压成功");
        }
    }

3、解压ZIP

 @MethodOperation("解析本地unZip文件")
 public static void unZip(InputStream inputStream, String outPath) throws IOException {
    ZipInputStream zipInputStream = null;
      try {
           zipInputStream = new ZipInputStream(inputStream, Charset.forName("gbk"));
           ZipEntry nextEntry = zipInputStream.getNextEntry();
           while (nextEntry != null) {
                File file = new File(outPath + File.separator + nextEntry.getName());
                if (nextEntry.isDirectory()) {
                    file.mkdir();
                    nextEntry = zipInputStream.getNextEntry();
                    nextEntry.clone();
                    continue;
                }
                fileOutput(zipInputStream, file);
                nextEntry.clone();
                nextEntry = zipInputStream.getNextEntry();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                zipInputStream.closeEntry();
                closeInputStream(inputStream);
                if (null != zipInputStream) {
                    zipInputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            log.info("ZIP文件解压成功");
        }
 }

4、其他分解的方法

@MethodOperation("将文件输出到某个位置")
private static void fileOutput(InputStream inputStream, File file) throws IOException {
     FileOutputStream fileOutputStream = new FileOutputStream(file);
     BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
    int n;
     byte[] bytes = new byte[1024];
      while ((n = inputStream.read(bytes)) != -1) {
          bufferedOutputStream.write(bytes, 0, n);
      }
      bufferedOutputStream.close();
      fileOutputStream.close();
  }

@MethodOperation("文件输出")
private static void fileOutput(File file, SevenZFile sevenZFile, SevenZArchiveEntry entry) throws IOException {
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(file);
            byte[] content = new byte[(int) entry.getSize()];
            sevenZFile.read(content, 0, content.length);
            out.write(content);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
 }


@MethodOperation("将inputStream转化为file")
private static void inputStream2File(InputStream is, File file) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream(file);
            int len = 0;
            byte[] buffer = new byte[8192];
            while ((len = is.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
        } finally {
            try {
                is.close();
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

@MethodOperation("关闭流")
private static void closeInputStream(InputStream inputStream) {
        try {
            if (inputStream != null) {
                inputStream.close();
            }
        } catch (Exception e) {
        }
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值