用多少眼泪才能让你相信 发表于 2023-6-30 14:56:44

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;<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;<br>                    // // 第一层文件夹名称<br>                    // String firstFile = split;<br>                    StringBuffer sb = new StringBuffer();<br>                    for (int i = 1; i < split.length-1; i++) {<br>                        sb.append(split).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;<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;<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
 
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: zip解压和压缩