Java中解压缩文件的方法

丿BAIKAL巛 2024-06-21 13:35:01 阅读 62

文章目录

一、使用的技术二、实际用法三、文件解压缩方法(通用)四、完整代码逻辑

如何实现一个上传压缩包,然后将压缩包进行解压?

下面我们就来实现一下这个代码。

最终实现的效果

上传一个压缩包文件,会将压缩包文件下载到本地,然后再将压缩包解压到同目录下的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; }}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。