Java实现解压缩ZIP
1、MultipartFile 转为File工具类
@Component
public class MultipartFileToFile {
public File ultipartFileToFile(MultipartFile file) throws Exception {
File toFile = null;
if (file.equals("") || file.getSize() <= 0) {
file = null;
} else {
InputStream ins = null;
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
ins.close();
}
return toFile;
}
//获取流文件
private static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2、获取压缩文件中的全部文件名称
@Resource
private MultipartFileToFile multipartFileToFile;
/**
* 获取压缩文件中的全部文件名称
* @param multipartFile
* @return List
*/
@PostMapping("getFileName")
public R getFileName(MultipartFile multipartFile){
//创建List,存放获取的文件名称
List<String> list = new ArrayList<>();
File file=null;
try {
//将MultipartFile转化为File
file = multipartFileToFile.ultipartFileToFile(multipartFile);
//创建ZipFile对象,解析file文件
ZipFile zipFile = new ZipFile(file);
//获取压缩文件中的文件个数
int size = zipFile.size();
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
list.add(entries.nextElement().getName());
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(list);
return R.ok().data("list",list);
}
3、解压文件到指定目录
/**
* 解压文件到指定目录
* @param multipartFile
* @return success/error
*/
@PostMapping("decmpressionFile")
public R decmpression(MultipartFile multipartFile){
//指定压缩文件存放路径(最后一个/不能少)
String descDir="F://online-education/";
File Zipfile=null;
try {
//将MultipartFile转化为File
Zipfile = multipartFileToFile.ultipartFileToFile(multipartFile);
File pathFile = new File(descDir);
if(!pathFile.exists())
{
pathFile.mkdirs();
}
//解决zip文件中有中文目录或者中文文件
ZipFile zip = new ZipFile(Zipfile, Charset.forName("GBK"));
for(Enumeration entries = zip.entries(); entries.hasMoreElements();)
{
ZipEntry entry = (ZipEntry)entries.nextElement();
String zipEntryName = entry.getName();
InputStream in = zip.getInputStream(entry);
String outPath = (descDir+zipEntryName).replaceAll("\\*", "/");;
//判断路径是否存在,不存在则创建文件路径
File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
if(!file.exists())
{
file.mkdirs();
}
//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
if(new File(outPath).isDirectory())
{
continue;
}
//输出文件路径信息
System.out.println(outPath);
OutputStream out = new FileOutputStream(outPath);
byte[] buf1 = new byte[1024];
int len;
while((len=in.read(buf1))>0)
{
out.write(buf1,0,len);
}
in.close();
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return R.ok();
}
*问题:将MultipartFile转化为File后,放到ZipFile中,使用zipFile.size方法获取数量及压缩文件中的文件名称,会出现一个名为压缩包文件名称的文件,数量同样多一个。*