ToB企服应用市场:ToB评测及商务社交产业平台
标题:
zip解压和压缩
[打印本页]
作者:
用多少眼泪才能让你相信
时间:
2023-6-30 14:56
标题:
zip解压和压缩
zip解压和压缩
引言
介绍zip文件的概念
涉及到的Java类和包:java.util.zip
https://blog.csdn.net/u012998680/article/details/126060855
压缩文件
准备压缩的源文件和目标zip文件的路径
创建FileOutputStream和ZipOutputStream对象
创建源文件的File和FileInputStream对象
创建ZipEntry对象,并设置其名称为源文件的名称
使用ZipOutputStream的putNextEntry方法将ZipEntry对象添加到压缩文件中
使用循环读取源文件的内容,并使用ZipOutputStream的write方法将内容写入压缩文件中
关闭流对象
解压缩文件
准备解压缩的zip文件路径和目标目录路径
创建目标目录的File对象,如果目录不存在则创建目录
创建ZipInputStream对象,使用FileInputStream和zip文件路径作为参数
使用ZipInputStream的getNextEntry方法获取zip文件的每个条目ZipEntry
循环处理每个zip条目,获取条目的名称和文件内容,并将内容写入目标目录
关闭流对象
示例代码
创建zip工具类:
import org.springframework.mock.web.MockMultipartFile;<br>import org.springframework.web.multipart.MultipartFile;<br><br>import java.io.*;<br>import java.nio.charset.Charset;<br>import java.util.*;<br>import java.util.zip.ZipEntry;<br>import java.util.zip.ZipInputStream;<br><br><br>public class ZipUtil {<br> // 解压并返回的key是全路径<br> public static Map<String, List<MultipartFile>> unzipAndConvertToMap(File file) throws IOException {<br> Map<String, List<MultipartFile>> map = new HashMap<>(); // 存放解压后的图片<br> byte[] buffer = new byte[1024];<br> ZipInputStream zis = new ZipInputStream(new FileInputStream(file),Charset.forName("GBK"));<br> try {<br> ZipEntry entry;<br> while ((entry = zis.getNextEntry()) != null) {<br><br> if (!entry.isDirectory() && isImage(entry.getName())) { // 判断当前解压的是否是图片<br> // 获取到全路径名称<br> String allFileName = entry.getName();<br> String[] split = allFileName.split("/");<br> // // 图片名称<br> // String imageName = split[split.length - 1];<br> // // 第一层文件夹名称<br> // String firstFile = split[0];<br> StringBuffer sb = new StringBuffer();<br> for (int i = 1; i < split.length-1; i++) {<br> sb.append(split[i]).append("/");<br> }<br> String folderName = sb.toString();<br> List<MultipartFile> imgList = map.getOrDefault(folderName, new ArrayList<>());<br> ByteArrayOutputStream baos = new ByteArrayOutputStream();<br> int len;<br> while ((len = zis.read(buffer)) > 0) {<br> baos.write(buffer, 0, len);<br> }<br> MultipartFile multipartFile = new MockMultipartFile(entry.getName(), entry.getName(), "", baos.toByteArray());<br> imgList.add(multipartFile);<br> map.put(folderName, imgList);<br> }<br> }<br> } finally {<br> zis.close();<br> }<br> return map;<br> }<br><br> // 解压zip并取出文件夹中的所有image格式数据(仅为一层路径)<br> public static Map<String, List<MultipartFile>> unzipAndExtractImages(File file) throws IOException {<br> Map<String, List<MultipartFile>> map = new HashMap<>(); // 存放解压后的图片<br> byte[] buffer = new byte[1024];<br> ZipInputStream zis = new ZipInputStream(new FileInputStream(file),Charset.forName("GBK"));<br> try {<br> ZipEntry entry;<br> while ((entry = zis.getNextEntry()) != null) {<br><br> if (!entry.isDirectory() && isImage(entry.getName())) { // 判断当前解压的是否是图片<br><br> String folderName = new File(entry.getName()).getParentFile().getName(); // 获取图片所在的文件夹名称<br> List<MultipartFile> imgList = map.getOrDefault(folderName, new ArrayList<>());<br> ByteArrayOutputStream baos = new ByteArrayOutputStream();<br> int len;<br> while ((len = zis.read(buffer)) > 0) {<br> baos.write(buffer, 0, len);<br> }<br> MultipartFile multipartFile = new MockMultipartFile(entry.getName(), entry.getName(), "", baos.toByteArray());<br> imgList.add(multipartFile);<br> map.put(folderName, imgList);<br> }<br> }<br> } finally {<br> zis.close();<br> }<br> return map;<br> }<br><br> // 判断是否是图片格式<br> private static boolean isImage(String fileName) { // 判断当前解压中的文件是否是图片<br> String lowerCaseFileName = fileName.toLowerCase();<br> return lowerCaseFileName.endsWith(".jpg") || lowerCaseFileName.endsWith(".jpeg") || lowerCaseFileName.endsWith(".png");<br> }<br><br> /**<br> * MultipartFile 转 File<br> *<br> * @param file<br> * @throws Exception<br> */<br> public static File multipartFileToFile(MultipartFile file) throws Exception {<br> File toFile = null;<br> if (file.equals("") || file.getSize() <= 0) {<br> file = null;<br> } else {<br> InputStream ins = null;<br> ins = file.getInputStream();<br> toFile = new File(Objects.requireNonNull(file.getOriginalFilename()));<br> inputStreamToFile(ins, toFile);<br> ins.close();<br> }<br> return toFile;<br> }<br><br> /**<br> * 删除生成file时产生的临时文件<br> * @param file<br> */<br> public static void delteTempFile(File file) {<br> if (file != null) {<br> File del = new File(file.toURI());<br> del.delete();<br> }<br> }<br><br> //获取流文件<br> private static void inputStreamToFile(InputStream ins, File file) {<br> try {<br> OutputStream os = new FileOutputStream(file);<br> int bytesRead = 0;<br> byte[] buffer = new byte[8192];<br> while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {<br> os.write(buffer, 0, bytesRead);<br> }<br> os.close();<br> ins.close();<br> } catch (Exception e) {<br> e.printStackTrace();<br> }<br> }
复制代码
</ul>
注意事项:
示例代码中的文件路径需要根据实际情况进行修改
在编写代码时要注意异常处理和流的关闭操作,以确保资源的正确释放和防止内存泄漏
扩展
实现rar格式参考:
Java 代码实现rar解压最全攻略操作
junrar依赖版本
河蟹驿站的博客-CSDN博客
https://blog.csdn.net/qq_45350099/article/details/131199431
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4