解压java下载_Java解压zip及rar

项目使用当中遇到的吭

1:rar格式压缩包仅支持WINRAR5以下的,如果是WINRAR5+ 那么FileHeaders获取的size就为0;

2:因为用的是springboot所以本地文件夹获取不到路径,因为最终要打成jar包运行在服务器的(获取项目路径本地是可以的,但是在linux上会出现找不到路径)

3:文件夹传统方式的也是无法删除(技术有限)

package com.isky.dataservice.utils;

import java.io.File;

import java.util.HashSet;

import java.util.Map;

import java.util.Set;

import com.isky.common.utils.StringUtil;

import com.isky.dataservice.utils.enums.CommonEnum;

import org.springframework.web.multipart.MultipartFile;

/**

* 解压文件包(zip和rar格式)

* @param file

*/

public class UploadUtil {

public static String path = "/home/asserts";

/**

* 解析上传的压缩文件

*

* @param file 上传文件

* @return

* @throws Exception

*/

public static Set resolveCompressUploadFile(MultipartFile file) throws Exception {

String[] pics = {"jpg", "jpeg", "png", "psd", "gif", "bmp", "tiff", "cdr", "svg"};

String[] files = {"pdf", "txt", "text", "xlsx", "xls", "docx", "doc", "json", "xml", "csv", "rar", "zip"};

String[] videos = {"ape", "ra", "wma", "mp3", "mp4", "wmv", "vob", "mkv", "mpe", "mpeg", "mpg", "divx", "avi", "rmvb", "rm", "asf", "mov", "flv", "3gp"};

Map map = null;

if (file.isEmpty()) {

throw new Exception(CommonEnum.FILE_NOT_NULL.getName());

}

String fileName = file.getOriginalFilename();

int pos = fileName.lastIndexOf(".");

//获取后缀名

String extName = fileName.substring(pos + 1).toLowerCase();

HashSet set = new HashSet<>();

if (extName.equals("zip") || extName.equals("rar")) {

String saveName = StringUtil.getUUID() + "." + extName;

String saveFileName = saveName.substring(0, saveName.lastIndexOf("."));

// 根据服务器的文件保存地址和原文件名创建目录文件全路径

File pushFile = new File(path + "/" + saveFileName + "/" + saveName);

File descFile = new File(path + "/" + saveFileName);

if (!descFile.exists()) {

descFile.mkdirs();

}

//解压目的文件

String descDir = path + "/" + saveFileName + "/";

file.transferTo(pushFile);

if (extName.equals("zip")) {

map = CompressFileUtils.unZipFiles(pushFile, descDir);

} else {

map = CompressFileUtils.unRarFile(pushFile.getAbsolutePath(), descDir);

}

Set strings = map.keySet();

outer:

for (String str : strings) {

for (int i = 0; i < pics.length; i++) {

if (str.equalsIgnoreCase(pics[i])) {

set.add(3);

continue outer;

}

}

for (int i = 0; i < videos.length; i++) {

if (str.equalsIgnoreCase(videos[i])) {

set.add(5);

continue outer;

}

}

for (int i = 0; i < files.length; i++) {

if (str.equalsIgnoreCase(files[i])) {

set.add(4);

continue outer;

}

}

set.add(99);

}

if (descFile.exists()) {

deleteAllFilesOfDir(descFile);

descFile.delete();

}

return set;

}

for (String str : pics) {

if (extName.equalsIgnoreCase(str)) {

set.add(3);

return set;

}

}

for (String str : videos) {

if (extName.equalsIgnoreCase(str)) {

set.add(5);

return set;

}

}

for (String str : files) {

if (extName.equalsIgnoreCase(str)) {

set.add(4);

return set;

}

}

set.add(99);

return set;

}

public static void deleteAllFilesOfDir(File path) {

if (null != path) {

if (!path.exists()) {

return;

}

if (path.isFile()) {

boolean result = path.delete();

int count = 0;

while (!result && count++ < 10) {

System.gc();

result = path.delete();

}

}

File[] files = path.listFiles();

if (null != files) {

for (File f : files) {

deleteAllFilesOfDir(f);

}

}

path.delete();

}

}

}

package com.isky.dataservice.utils;

import java.io.*;

import java.util.Enumeration;

import java.util.HashMap;

import java.util.Map;

import com.github.junrar.Archive;

import com.github.junrar.rarfile.FileHeader;

import org.apache.tools.zip.ZipEntry;

import org.apache.tools.zip.ZipFile;

/**

* @author Administrator

*/

public class CompressFileUtils {

/**

* 解压文件到指定目录

*

* @param zipFile

* @param descDir

*/

@SuppressWarnings("rawtypes")

public static Map unZipFiles(File zipFile, String descDir) throws IOException {

Map map = new HashMap<>();

File pathFile = new File(descDir);

if (!pathFile.exists()) {

pathFile.mkdirs();

}

ZipFile zip = new ZipFile(zipFile, "gbk");

for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) {

ZipEntry entry = (ZipEntry) entries.nextElement();

String zipEntryName = entry.getName();

//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压

if (entry.isDirectory()) {

continue;

}

int i = zipEntryName.lastIndexOf(".");

String sbu = zipEntryName.substring(i + 1);

map.put(sbu, "1");

}

return map;

}

/**

* 根据原始rar路径,解压到指定文件夹下.

*

* @param srcRarPath 原始rar路径

* @param dstDirectoryPath 解压到的文件夹

*/

public static Map unRarFile(String srcRarPath, String dstDirectoryPath) throws Exception {

Map map = new HashMap<>();

FileOutputStream os = null;

File dstDiretory = new File(dstDirectoryPath);

if (!dstDiretory.exists()) {

dstDiretory.mkdirs();

}

Archive a = null;

a = new Archive(new File(srcRarPath));

if (a != null) {

FileHeader fh = a.nextFileHeader();

while (fh != null) {

if (fh.isDirectory()) {

File fol = new File(dstDirectoryPath + File.separator

+ fh.getFileNameString());

fol.mkdirs();

} else {

File out = new File(dstDirectoryPath + File.separator

+ fh.getFileNameString().trim());

String fileName = fh.getFileNameString().trim();

String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);

map.put(fileType, "1");

if (!out.exists()) {

if (!out.getParentFile().exists()) {

out.getParentFile().mkdirs();

}

out.createNewFile();

}

os = new FileOutputStream(out);

a.extractFile(fh, os);

}

fh = a.nextFileHeader();

}

}

if(os != null){

os.close();

}

if(a != null){

a.close();

}

return map;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值