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方法獲取數量及壓縮文件中的文件名稱,會出現一個名為壓縮包文件名稱的文件,數量同樣多一個。*