最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java解壓RAR文件的三種方式

 更新時間:2023年07月28日 10:49:40   作者:韓大胖同志  
這篇文章主要給大家介紹了關(guān)于Java解壓RAR文件的三種方式,Java自身并不支持解壓RAR文件,需要使用第三方庫來實現(xiàn),文中給出了詳細的示例代碼,需要的朋友可以參考下

第一種:

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"));//創(chuàng)建壓縮文件對象
		//開始解壓
		Enumeration<?> entries = zipFile.entries();
		while (entries.hasMoreElements()) {
			ZipEntry entry = (ZipEntry) entries.nextElement();
			// 如果是文件夾,就創(chuàng)建個文件夾
			if (entry.isDirectory()) {
				String dirPath = destDirPath + "/" + entry.getName();
				srcFile.mkdirs();
			} else {
				// 如果是文件,就先創(chuàng)建一個文件,然后用io流把內(nèi)容copy過去
				File targetFile = new File(destDirPath + "/" + entry.getName());
				// 保證這個文件的父文件夾必須要存在
				if (!targetFile.getParentFile().exists()) {
					targetFile.getParentFile().mkdirs();
				}
				targetFile.createNewFile();
				// 將壓縮文件內(nèi)容寫入到這個文件中
				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);
				}
				// 關(guān)流順序,先打開的后關(guān)閉
				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數(shù)組中
             byte[] bytes = os.toByteArray();
             System.out.println(bytes.length);
             if ("rar".equals(fileExt)) {
                 Archive secondArchive = new Archive(new ByteArrayInputStream(bytes));
                 // 循環(huán)解壓
             }
         }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

第三種:

/**
     * 根據(jù)原始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);
        // 目標目錄不存在時,創(chuàng)建該文件夾
        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系統(tǒng)中\(zhòng)分隔符無法識別問題
                    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()) {
                        // 相對路徑可能多級,可能需要創(chuàng)建父目錄.
                        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;
    }

總結(jié) 

到此這篇關(guān)于Java解壓RAR文件的三種方式的文章就介紹到這了,更多相關(guān)Java解壓RAR文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文帶你搞懂Java中線程的創(chuàng)建方式

    一文帶你搞懂Java中線程的創(chuàng)建方式

    這篇文章主要為大家詳細介紹了Java中線程的創(chuàng)建方式的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • spring boot整合CAS Client實現(xiàn)單點登陸驗證的示例

    spring boot整合CAS Client實現(xiàn)單點登陸驗證的示例

    本篇文章主要介紹了spring boot整合CAS Client實現(xiàn)單點登陸驗證的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Springboot+jwt實現(xiàn)在線用戶功能(示例代碼)

    Springboot+jwt實現(xiàn)在線用戶功能(示例代碼)

    這篇文章主要介紹了Springboot+jwt實現(xiàn)在線用戶功能,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Java手寫持久層框架的詳細代碼

    Java手寫持久層框架的詳細代碼

    這篇文章主要介紹了Java手寫持久層框架,本文適合有一定java基礎(chǔ)的同學(xué),通過自定義持久層框架,可以更加清楚常用的mybatis等開源框架的原理,需要的朋友可以參考下
    2022-08-08
  • Java JDBC導(dǎo)致的反序列化攻擊原理解析

    Java JDBC導(dǎo)致的反序列化攻擊原理解析

    這篇文章主要介紹了Java JDBC導(dǎo)致的反序列化攻擊原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • java發(fā)送http請求并獲取狀態(tài)碼的簡單實例

    java發(fā)送http請求并獲取狀態(tài)碼的簡單實例

    下面小編就為大家?guī)硪黄猨ava發(fā)送http請求并獲取狀態(tài)碼的簡單實例。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • Java面向?qū)ο笾畠?nèi)部類詳解

    Java面向?qū)ο笾畠?nèi)部類詳解

    在 Java 中,允許一個類的定義位于另一個類的內(nèi)部,前者稱為內(nèi)部類,后者稱為外部類。這篇文章將總結(jié)一下內(nèi)部類的使用,感興趣的可以了解一下
    2022-10-10
  • Mybatis中如何進行批量更新(updateBatch)

    Mybatis中如何進行批量更新(updateBatch)

    這篇文章主要介紹了Mybatis中如何進行批量更新(updateBatch),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • java設(shè)計模式之觀察者模式學(xué)習(xí)

    java設(shè)計模式之觀察者模式學(xué)習(xí)

    這篇文章主要為大家詳細介紹了java設(shè)計模式之觀察者模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • mybatis-generator生成文件覆蓋問題的解決

    mybatis-generator生成文件覆蓋問題的解決

    這篇文章主要介紹了mybatis-generator生成文件覆蓋問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論

凉山| 高平市| 竹山县| 曲沃县| 怀柔区| 南投县| 麟游县| 姚安县| 济宁市| 澄城县| 遂平县| 桐梓县| 枣阳市| 虞城县| 红安县| 中江县| 锡林浩特市| 昌邑市| 左云县| 邵阳县| 安化县| 历史| 阿荣旗| 长寿区| 凤阳县| 民丰县| 深州市| 汶川县| 维西| 孟州市| 贵溪市| 收藏| 花莲市| 靖宇县| 佛教| 洮南市| 邓州市| 米易县| 麦盖提县| 安仁县| 肇庆市|