首页 > 基础资料 博客日记
Java中解压缩文件的方法
2024-06-30 01:00:05基础资料围观161次
如何实现一个上传压缩包,然后将压缩包进行解压?
下面我们就来实现一下这个代码。
最终实现的效果:
上传一个压缩包文件,会将压缩包文件下载到本地,然后再将压缩包解压到同目录下的extracted文件夹下。
这是压缩包内的文件,三张图片
一、使用的技术
使用的是Java自带的java.util.zip.ZipFile包。
java.util.zip.ZipFile
是 Java 中用于处理 ZIP 文件的类。它提供了读取 ZIP 文件内容的功能,允许你以编程方式从 ZIP 文件中提取文件和目录结构,以及读取其中的数据。
下面是一些 ZipFile
类的主要特性和用法:
-
读取 ZIP 文件内容:
ZipFile
允许你打开一个 ZIP 文件,并从中读取内容。你可以通过提供 ZIP 文件的路径或者File
对象来创建一个ZipFile
实例。 -
访问 ZIP 文件中的条目(entries): 一旦你打开了一个 ZIP 文件,你可以通过
entries()
方法获取 ZIP 文件中的所有条目。每个条目代表 ZIP 文件中的一个文件或目录。 -
提取文件内容: 通过
getInputStream()
方法,你可以从 ZIP 文件中提取特定文件的内容。这个方法返回一个InputStream
对象,你可以使用它来读取文件的数据。 -
关闭 ZIP 文件: 使用
close()
方法关闭ZipFile
实例,释放相关资源。
二、实际用法
实际使用的时候是从前端上传压缩包文件,然后后端接收。(具体参考后文Contrller中的完整代码逻辑)
1、上传的一般都是MultipartFile
类型,需要先将MultipartFile类型转为File类型,使用FileUtils.copyInputStreamToFile
这个方法。
2、转换为File类型时就需要先将文件存到本地,所以在这里指定了一个压缩包的文件路径File fileTemp = new File("D:\\unzipTest\\Test.zip");
3、使用getAbsolutePath
方法来获取这个路径,将压缩包的本地路径传给fileUncompressing
文件解压缩方法即可完成解压。
4、在文件解压缩方法中,会将文件解压到D:\\unzipTest\\extracted
这个目录下,可以自行修改,也可以作为一个参数传进去。
我这里解压缩的时候获取了某个固定文件类型的文件路径集合,如果需要在解压缩的时候做逻辑处理,可以参考。如果只是单纯的解压缩,可以把这个逻辑删掉。
//要下载到的本地临时文件路径
File fileTemp = new File("D:\\unzipTest\\Test.zip");
File parentFolder = fileTemp.getParentFile();
//如果父文件夹(unzipTest)不存在则创建
if(!parentFolder.exists()){
//创建父文件夹及其所有上级文件夹
parentFolder.mkdir();
}
//MultipartFile转File
org.apache.commons.io.FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), fileTemp);
//压缩包文件路径
String zipFilePath = fileTemp.getAbsolutePath();
fileUncompressing(zipFilePath);
三、文件解压缩方法(通用)
/**
* 文件解压缩
* @return
*/
public static List<String> fileUncompressing(String zipFilePath){
String targetFolder = "D:\\unzipTest\\extracted";
//文件名后缀
String ncLastName=".nc";
List<String> pathList=new ArrayList<>();
try {
// 创建目标文件夹
File targetDir = new File(targetFolder);
targetDir.mkdirs();
// 打开压缩文件
// ZipFile zipFile = new ZipFile(zipFilePath);
ZipFile zipFile = new ZipFile(zipFilePath, Charset.forName("gbk"));
// 遍历压缩文件中的所有条目
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
// 解压缩条目到目标文件夹
String entryName = entry.getName();
entryName = new String(entryName.getBytes(Charset.forName("gbk")));
File entryFile = new File(targetDir, entryName);
if (entry.isDirectory()) {
entryFile.mkdirs();
} else {
entryFile.getParentFile().mkdirs();
InputStream inputStream = zipFile.getInputStream(entry);
OutputStream outputStream = new FileOutputStream(entryFile);
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.close();
inputStream.close();
}
//判断文件是否是.nc结尾
if (entryName.endsWith(ncLastName)) {
// 拼接路径
Path path = Paths.get(targetFolder, entryName);
pathList.add(path.toString());
}
}
// 关闭压缩文件
zipFile.close();
// log.info("文件读取完成");
System.out.println("文件读取完成");
} catch (ZipException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return pathList;
}
四、完整代码逻辑
@RestController
@RequestMapping("/practice")
public class PracticeController extends BaseController
{
@PostMapping("/list")
public TableDataInfo list(MultipartFile multipartFile) throws IOException {
//要下载到的本地临时文件路径
File fileTemp = new File("D:\\unzipTest\\Test.zip");
File parentFolder = fileTemp.getParentFile();
//如果父文件夹(unzipTest)不存在则创建
if(!parentFolder.exists()){
//创建父文件夹及其所有上级文件夹
parentFolder.mkdir();
}
//MultipartFile转File
org.apache.commons.io.FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), fileTemp);
//压缩包文件路径
String zipFilePath = fileTemp.getAbsolutePath();
fileUncompressing(zipFilePath);
startPage();
List<StudentScores> list = new ArrayList<>();
return getDataTable(list);
}
/**
* 文件解压缩
* @return
*/
public static List<String> fileUncompressing(String zipFilePath){
// String zipFilePath = "D:\\unzipTest\\ERA5.zip";
String targetFolder = "D:\\unzipTest\\extracted";
//文件名后缀
String ncLastName=".nc";
List<String> pathList=new ArrayList<>();
try {
// 创建目标文件夹
File targetDir = new File(targetFolder);
targetDir.mkdirs();
// 打开压缩文件
// ZipFile zipFile = new ZipFile(zipFilePath);
ZipFile zipFile = new ZipFile(zipFilePath, Charset.forName("gbk"));
// 遍历压缩文件中的所有条目
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
// 解压缩条目到目标文件夹
String entryName = entry.getName();
entryName = new String(entryName.getBytes(Charset.forName("gbk")));
File entryFile = new File(targetDir, entryName);
if (entry.isDirectory()) {
entryFile.mkdirs();
} else {
entryFile.getParentFile().mkdirs();
InputStream inputStream = zipFile.getInputStream(entry);
OutputStream outputStream = new FileOutputStream(entryFile);
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.close();
inputStream.close();
}
//判断文件是否是.nc结尾
if (entryName.endsWith(ncLastName)) {
// 拼接路径
Path path = Paths.get(targetFolder, entryName);
pathList.add(path.toString());
}
}
// 关闭压缩文件
zipFile.close();
// log.info("文件读取完成");
System.out.println("文件读取完成");
} catch (ZipException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return pathList;
}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: