Java解压RAR文件的几种方式

这篇具有很好参考价值的文章主要介绍了Java解压RAR文件的几种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一种:

public class fileZipUtil {
	/**
	 * zip文件解压
	 * @param inputFile  待解压文件夹/文件
	 * @param destDirPath  解压路径
	 */
	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();
			}
		}
	}

	/**
	 * 解压RAR压缩文件到指定路径
	 * @param rarFile RAR压缩文件
	 * @param dstDir 解压到的文件夹路径
	 */
	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<FileHeader> 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(".");
			//获取文件的后缀名 .jpg
			String 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();
		}
	}

}

第二种:

// 获取本地rar
public 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();
    }
}

第三种:

/**
     * 根据原始rar路径,解压到指定文件夹下
     * 这种方法只能解压rar 5.0版本以下的,5.0及其以上的无法解决
     *
     * @param srcRarPath       原始rar路径+name
     * @param dstDirectoryPath 解压到的文件夹
     */
    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://www.toymoban.com/news/detail-604875.html

到了这里,关于Java解压RAR文件的几种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python实现rar、zip和7z文件的压缩和解压

    一、7z压缩文件的压缩和解压 1、安装py7zr 我们要先安装 py7zr 第三方库: 如果python环境有问题,执行上面那一条安装语句老是安装在默认的python环境的话,我们可以执行下面这条语句,将第三方库安装在项目的虚拟环境中: 2、解压7z文件 3、压缩成7z文件 二、rar压缩文件的压

    2024年02月07日
    浏览(53)
  • 服务器使用——解压常见文件tar、zip、rar等

    1.tar文件 2.zip文件 这篇关于zip博客写的挺全的,这里直接放链接。 3.rar文件 首先下载RAR 6.21 for Linux x64 下载完后安装: 加压后可以看到有一个rar.txt,里面有rar具体的使用方法。这里粘贴复制下来

    2024年02月10日
    浏览(50)
  • [python]批量解压文件夹下所有压缩包(rar、zip、7z)

            在文件夹作用包含许多压缩包的时候,解压起来就很费时费力,尤其是在文件夹还存在嵌套的情况下,解压起来就更麻烦了。Franpper今天给大家带来递归遍历指定路径下的所有文件和文件夹,批量解压所有压缩包的方法,帮大家一键解压。         常见的压缩包格

    2024年02月09日
    浏览(60)
  • .net rar zip压缩包解压

    引入  SharpCompress https://download.csdn.net/download/weixin_42020830/87737306 string targetFile=\\\"c:\\\\test.zip\\\"; string zipFile=\\\"c:\\\\test\\\";  using (Stream stream =System.IO.File.OpenRead(targetFile))                     {                         var reader = ReaderFactory.Open(stream);                         while (r

    2024年02月01日
    浏览(46)
  • linux_文件压缩、文件解压(gzip命令、gunzip 命令、bzip2命令、bunzip2命令、tar命令、rar命令、zip命令)

    接上一篇:linux用户管理(查看在线用户who命令、创建用户adduser命令、创建用户组groupadd命令、查看用户组groups命令、删除用户、设置用户密码passwd命令) 本次来分享怎样在 linux中压缩和解压文件夹 ,在linux中压缩解压的方式有 5种 ,分别是 gz格式压缩解压、bz2格式压缩解压、

    2024年02月01日
    浏览(96)
  • Java读取文件的几种方式

    1. 使用流读取文件 2. 使用JDK1.7提供的NIO读取文件(适用于小文件) 3. 使用JDK1.7提供的NIO读取文件(适用于大文件) 4. 使用JDK1.4提供的NIO读取文件(适用于超大文件) 5. 使用cmmons-io依赖提供的FileUtils工具类读取文件 添加依赖: 6. 使用cmmons-io依赖提供的IOtils工具类读取文件 添加依赖:

    2024年02月16日
    浏览(50)
  • java 读取文件的几种方式

    在 Java 中有几种常用的方式来读取文件: 使用 FileInputStream 类以字节的方式读取文件。 使用 BufferedReader 在字符输入流上包装一个缓冲区,以行为单位读取文件。 使用 Scanner 类以分隔符为标志读取文件。 使用 Files 类的 readAllLines 方法一次性读取所有行。 使用 ObjectInputStream 反

    2024年02月14日
    浏览(46)
  • QT 利用开源7z 实现解压各种压缩包,包括进度条和文件名的显示(zip,7z,rar,iso等50多种格式)

            想做一个winRAR一样的解压软件吗?很简单,利用开源的7z库就能实现。我看网上其他人说的方法不敢苟同,误人子弟。以前自己在项目中使用过7z,这次又有需要,就想记录下来。如果你研究过如何用7z的话,一定知道7z的每一个GUID都代表了一种格式,50多种GUID也就有

    2024年02月04日
    浏览(51)
  • Java如何实现下载文件的几种方式

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Boy_Martin/article/details/126058565

    2024年02月13日
    浏览(65)
  • Java开发或调用WebService的几种方式

    1.服务端开发与发布 编写接口 编写接口的实现类 发布服务 访问已发布的WebService服务 打开浏览器输入http://127.0.0.1:8888/JaxWSTest?wsdl访问,如下面内容 截图内容1 浏览器中输入wsdl文档中的 http://127.0.0.1:8888/JaxWSTest?xsd=1可查看绑定的参数等信息看如下图: 截图内容2 jdk自带生成W

    2024年01月17日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包