失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > java实现 zip rar 7z 压缩包解压

java实现 zip rar 7z 压缩包解压

时间:2023-09-28 21:40:49

相关推荐

java实现 zip rar 7z 压缩包解压

1、7z和rar需要引入maven依赖,zip使用java自带的

<!-- 7z解压依赖 --><dependency><groupId>mons</groupId><artifactId>commons-compress</artifactId><version>1.9</version></dependency><dependency><groupId>org.tukaani</groupId><artifactId>xz</artifactId><version>1.5</version></dependency><!-- rar解压依赖 -- ><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>

2、编写解压util工具类

/*** 文件解压缩工具类*/public class UnFileUtil {/*** rar解压缩* @param rarFilerar文件的全路径* @return 压缩包中所有的文件*/@SuppressWarnings("resource")public static Map<String, String> unRar(String rarFile) {RandomAccessFile randomAccessFile = null;IInArchive archive = null;try {File f = new File(rarFile);randomAccessFile = new RandomAccessFile(f.getAbsolutePath(), "rw");archive = SevenZip.openInArchive(ArchiveFormat.RAR,new RandomAccessFileInStream(randomAccessFile));String outPath = f.getAbsolutePath().substring(0, f.getAbsolutePath().indexOf("."));File zdir = new File(outPath);if (zdir.isDirectory()) {zdir.delete();}zdir.mkdir();int[] in = new int[archive.getNumberOfItems()];for (int i = 0; i < in.length; i++) {in[i] = i;}archive.extract(in, false, new ExtractCallback(archive,zdir.getAbsolutePath() + "/"));//解压后获取压缩包下全部文件列表Map<String, String> zipFileMap = getFileNameList(outPath,"");return zipFileMap;} catch (FileNotFoundException | SevenZipException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {if(randomAccessFile != null) randomAccessFile.close();if(archive != null) archive.close();} catch (IOException e) {e.printStackTrace();}}return null;}/*** 获取压缩包中的全部文件* @param path文件夹路径* @childName 每一个文件的每一层的路径==D==区分层数* @return 压缩包中所有的文件*/private static Map<String, String> getFileNameList(String path, String childName) {System.out.println("path:" + path + "---childName:"+childName);Map<String, String> files = new HashMap<>();File file = new File(path); // 需要获取的文件的路径String[] fileNameLists = file.list(); // 存储文件名的String数组File[] filePathLists = file.listFiles(); // 存储文件路径的String数组for (int i = 0; i < filePathLists.length; i++) {if (filePathLists[i].isFile()) {files.put(fileNameLists[i] + "==D==" + childName, path + File.separator + filePathLists[i].getName());} else {files.putAll(getFileNameList(path + File.separator + filePathLists[i].getName(), childName + "&" + filePathLists[i].getName()));}}return files;}/*** zip解压缩* @param zipFilePathzip文件的全路径* @param unzipFilePath解压后文件保存路径* @param includeZipFileName解压后文件是否包含压缩包文件名,true包含,false不包含* @return 压缩包中所有的文件*/@SuppressWarnings("resource")public static Map<String, String> unZip(String zipFilePath, String unzipFilePath, boolean includeZipFileName) throws Exception{File zipFile = new File(zipFilePath);//如果包含压缩包文件名,则处理保存路径if(includeZipFileName){String fileName = zipFile.getName();if(StringUtils.isNotEmpty(fileName)){fileName = fileName.substring(0,fileName.lastIndexOf("."));}unzipFilePath = unzipFilePath + File.separator + fileName;}//判断保存路径是否存在,不存在则创建File unzipFileDir = new File(unzipFilePath);if(!unzipFileDir.exists() || !unzipFileDir.isDirectory()){unzipFileDir.mkdirs();}//开始解压ZipEntry entry = null;String entryFilePath = null, entryDirPath = "";File entryFile = null, entryDir = null;int index = 0, count = 0, bufferSize = 1024;byte[] buffer = new byte[bufferSize];BufferedInputStream bis = null;BufferedOutputStream bos = null;Charset gbk = Charset.forName("GBK");ZipFile zip = new ZipFile(zipFile, gbk);try {Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();while (entries.hasMoreElements()) {entry = entries.nextElement();entryFilePath = unzipFilePath + File.separator + entry.getName();entryFilePath = entryFilePath.replace("/", File.separator);index = entryFilePath.lastIndexOf(File.separator);if (index != -1) {entryDirPath = entryFilePath.substring(0, index);}entryDir = new File(entryDirPath);if (!entryDir.exists() || !entryDir.isDirectory()) {entryDir.mkdirs();}entryFile = new File(entryFilePath);//判断当前文件父类路径是否存在,不存在则创建if(!entryFile.getParentFile().exists() || !entryFile.getParentFile().isDirectory()){entryFile.getParentFile().mkdirs();}//不是文件说明是文件夹创建即可,无需写入if(entryFile.isDirectory()){continue;}bos = new BufferedOutputStream(new FileOutputStream(entryFile));bis = new BufferedInputStream(zip.getInputStream(entry));while ((count = bis.read(buffer, 0, bufferSize)) != -1) {bos.write(buffer, 0, count);}}}catch (Exception e){e.printStackTrace();}finally {bos.flush();bos.close();bis.close();zip.close();}Map<String, String> resultMap = getFileNameList(unzipFilePath, "");return resultMap;}/*** zip解压缩* @param zipFilePathzip文件的全路径* @param includeZipFileName解压后文件是否包含压缩包文件名,true包含,false不包含* @return 压缩包中所有的文件*/@SuppressWarnings("resource")public static Map<String, String> unZip(String zipFilePath, boolean includeZipFileName) throws Exception{File zipFile = new File(zipFilePath);String unzipFilePath = zipFilePath.substring(0, zipFilePath.lastIndexOf(File.separator));//如果包含压缩包文件名,则处理保存路径if(includeZipFileName){String fileName = zipFile.getName();if(StringUtils.isNotEmpty(fileName)){fileName = fileName.substring(0,fileName.lastIndexOf("."));}unzipFilePath = unzipFilePath + File.separator + fileName;}//判断保存路径是否存在,不存在则创建File unzipFileDir = new File(unzipFilePath);if(!unzipFileDir.exists() || !unzipFileDir.isDirectory()){unzipFileDir.mkdirs();}//开始解压ZipEntry entry = null;String entryFilePath = null, entryDirPath = "";File entryFile = null, entryDir = null;int index = 0, count = 0, bufferSize = 1024;byte[] buffer = new byte[bufferSize];BufferedInputStream bis = null;BufferedOutputStream bos = null;Charset gbk = Charset.forName("GBK");ZipFile zip = new ZipFile(zipFile, gbk);try {Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();while (entries.hasMoreElements()) {entry = entries.nextElement();entryFilePath = unzipFilePath + File.separator + entry.getName();entryFilePath = entryFilePath.replace("/", File.separator);index = entryFilePath.lastIndexOf(File.separator);if (index != -1) {entryDirPath = entryFilePath.substring(0, index);}entryDir = new File(entryDirPath);if (!entryDir.exists() || !entryDir.isDirectory()) {entryDir.mkdirs();}entryFile = new File(entryFilePath);//判断当前文件父类路径是否存在,不存在则创建if(!entryFile.getParentFile().exists() || !entryFile.getParentFile().isDirectory()){entryFile.getParentFile().mkdirs();}//不是文件说明是文件夹创建即可,无需写入if(entryFile.isDirectory()){continue;}bos = new BufferedOutputStream(new FileOutputStream(entryFile));bis = new BufferedInputStream(zip.getInputStream(entry));while ((count = bis.read(buffer, 0, bufferSize)) != -1) {bos.write(buffer, 0, count);}bos.flush();bos.close();bis.close();}}catch (Exception e){e.printStackTrace();}finally {zip.close();}Map<String, String> resultMap = getFileNameList(unzipFilePath, "");return resultMap;}/*** 7z解压缩* @param z7zFilePath7z文件的全路径* @return 压缩包中所有的文件*/public static Map<String, String> un7z(String z7zFilePath){String un7zFilePath = "";//压缩之后的绝对路径SevenZFile zIn = null;try {File file = new File(z7zFilePath);un7zFilePath = file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf(".7z"));zIn = new SevenZFile(file);SevenZArchiveEntry entry = null;File newFile = null;while ((entry = zIn.getNextEntry()) != null){//不是文件夹就进行解压if(!entry.isDirectory()){newFile = new File(un7zFilePath, entry.getName());if(!newFile.exists()){new File(newFile.getParent()).mkdirs(); //创建此文件的上层目录}OutputStream out = new FileOutputStream(newFile);BufferedOutputStream bos = new BufferedOutputStream(out);int len = -1;byte[] buf = new byte[(int)entry.getSize()];while ((len = zIn.read(buf)) != -1){bos.write(buf, 0, len);}bos.flush();bos.close();out.close();}}} catch (Exception e) {e.printStackTrace();}finally {try {if (zIn != null)zIn.close();} catch (IOException e) {e.printStackTrace();}}Map<String, String> resultMap = getFileNameList(un7zFilePath, "");return resultMap;}public static void main(String[] args) {try {un7z("C:\\Users\\Admin\\Desktop\\1716F0190017.7z");} catch (Exception e) {e.printStackTrace();}}}

如果觉得《java实现 zip rar 7z 压缩包解压》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。