文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java解压RAR文件的几种方式

2023-09-04 07:20

关注

第一种:

public class fileZipUtil {public static void unZipFiles(String inputFile,String destDirPath) throws Exception {File srcFile = new File(inputFile);//获取当前压缩文件// 判断源文件是否存在if (!srcFile.exists()) {throw new Exception(srcFile.getPath() + "所指文件不存在");}ZipFile zipFile = new ZipFile(srcFile, Charset.forName("GBK"));//创建压缩文件对象//开始解压Enumeration entries = zipFile.entries();while (entries.hasMoreElements()) {ZipEntry entry = (ZipEntry) entries.nextElement();// 如果是文件夹,就创建个文件夹if (entry.isDirectory()) {String dirPath = destDirPath + "/" + entry.getName();srcFile.mkdirs();} else {// 如果是文件,就先创建一个文件,然后用io流把内容copy过去File targetFile = new File(destDirPath + "/" + entry.getName());// 保证这个文件的父文件夹必须要存在if (!targetFile.getParentFile().exists()) {targetFile.getParentFile().mkdirs();}targetFile.createNewFile();// 将压缩文件内容写入到这个文件中InputStream is = zipFile.getInputStream(entry);FileOutputStream fos = new FileOutputStream(targetFile);int len;byte[] buf = new byte[1024];while ((len = is.read(buf)) != -1) {fos.write(buf, 0, len);}// 关流顺序,先打开的后关闭fos.close();is.close();}}}public static void unRarFile(String rarPath, String dstDir) throws Exception {File dstDiretory = new File(dstDir);if (!dstDiretory.exists()) {dstDiretory.mkdirs();}try {File rarFile= new File(rarPath);Archive archive = new Archive(new FileInputStream(rarFile));List fileHeaders = archive.getFileHeaders();for (FileHeader fileHeader : fileHeaders) {if (fileHeader.isDirectory()) { String fileName=  fileHeader.getFileNameW();if(!existZH(fileName)){fileName = fileHeader.getFileNameString();}File dir = new File(dstDir + File.separator + fileName);if (!dir.exists()){dir.mkdirs();}} else {String fileName=  fileHeader.getFileNameW().trim();if(!existZH(fileName)){fileName = fileHeader.getFileNameString().trim();}File file = new File(dstDir + File.separator + fileName);try {if (!file.exists()) {if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}file.createNewFile();}FileOutputStream os = new FileOutputStream(file);archive.extractFile(fileHeader, os);os.close();} catch (Exception ex) {throw ex;}}}archive.close();} catch (Exception e) {throw e;}}public static boolean existZH(String str) {String regEx = "[\\u4e00-\\u9fa5]";Pattern p = Pattern.compile(regEx);Matcher m = p.matcher(str);while (m.find()) {return true;}return false;}    //使用main方法进行测试public static void main(String[] args) {try {String filepath = "E:\\test\\测试1.rar";String newpath="E:\\test\\zipTest";//获取最后一个.的位置int lastIndexOf = filepath.lastIndexOf(".");//获取文件的后缀名 .jpgString suffix = filepath.substring(lastIndexOf);System.out.println(suffix);if(suffix.equals(".zip")){unZipFiles(filepath,newpath);}else if(suffix.equals(".rar")){unRarFile(filepath,newpath);}} catch (Exception e) {e.printStackTrace();}}}

第二种:

// 获取本地rarpublic void unRarByPath() {    String rarPath = "D:\\文件.rar";    try {        File outFileDir = new File(rarPath);        Archive archive = new Archive(new FileInputStream(rarFile));        FileHeader fileHeader;         while ((fileHeader = archive.nextFileHeader()) != null) {         // 解决文件名中文乱码问题             String fileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() :                     fileHeader.getFileNameW();             String fileExt =                     fileName.substring(fileName.lastIndexOf(FileConstant.FILE_SEPARATOR) + 1);             System.out.println(fileName);             ByteArrayOutputStream os = new ByteArrayOutputStream();             archive.extractFile(fileHeader, os);            // 将文件信息写到byte数组中             byte[] bytes = os.toByteArray();             System.out.println(bytes.length);             if ("rar".equals(fileExt)) {                 Archive secondArchive = new Archive(new ByteArrayInputStream(bytes));                 // 循环解压             }         }    } catch (IOException e) {        e.printStackTrace();    }}

第三种:

    public static String unRarFile(String srcRarPath, String dstDirectoryPath) throws Exception {        log.debug("unRarFile srcRarPath:{}, dstDirectoryPath:{}", srcRarPath, dstDirectoryPath);        if (!srcRarPath.toLowerCase().endsWith(".rar")) {            log.warn("srcFilePath is not rar file");            return "";        }        File dstDiretory = new File(dstDirectoryPath);        // 目标目录不存在时,创建该文件夹        if (!dstDiretory.exists()) {            dstDiretory.mkdirs();        }        // @Cleanup Archive archive = new Archive(new File(srcRarPath));  com.github.junrar 0.7版本jarAPI        @Cleanup Archive archive = new Archive(new FileInputStream(new File(srcRarPath)));        if (archive != null) {            // 打印文件信息            archive.getMainHeader().print();            FileHeader fileHeader = archive.nextFileHeader();            while (fileHeader != null) {                // 解决中文乱码问题【压缩文件中文乱码】                String fileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() : fileHeader.getFileNameW();                // 文件夹                if (fileHeader.isDirectory()) {                    File fol = new File(dstDirectoryPath + File.separator + fileName.trim());                    fol.mkdirs();                } else { // 文件                    // 解决linux系统中\分隔符无法识别问题                    String[] fileParts = fileName.split("\\\\");                    StringBuilder filePath = new StringBuilder();                    for (String filePart : fileParts) {                        filePath.append(filePart).append(File.separator);                    }                    fileName = filePath.substring(0, filePath.length() - 1);                    File out = new File(dstDirectoryPath + File.separator + fileName.trim());                    if (!out.exists()) {                        // 相对路径可能多级,可能需要创建父目录.                        if (!out.getParentFile().exists()) {out.getParentFile().mkdirs();                        }                        out.createNewFile();                    }                    @Cleanup FileOutputStream os = new FileOutputStream(out);                    archive.extractFile(fileHeader, os);                }                fileHeader = archive.nextFileHeader();            }        } else {            log.warn("rar file decompression failed , archive is null");        }        return dstDirectoryPath;    }

来源地址:https://blog.csdn.net/qq_45350099/article/details/131199431

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯