zip解压和压缩

打印 上一主题 下一主题

主题 627|帖子 627|积分 1881

zip解压和压缩

引言

压缩文件


  • 准备压缩的源文件和目标zip文件的路径
  • 创建FileOutputStream和ZipOutputStream对象
  • 创建源文件的File和FileInputStream对象
  • 创建ZipEntry对象,并设置其名称为源文件的名称
  • 使用ZipOutputStream的putNextEntry方法将ZipEntry对象添加到压缩文件中
  • 使用循环读取源文件的内容,并使用ZipOutputStream的write方法将内容写入压缩文件中
  • 关闭流对象
解压缩文件


  • 准备解压缩的zip文件路径和目标目录路径
  • 创建目标目录的File对象,如果目录不存在则创建目录
  • 创建ZipInputStream对象,使用FileInputStream和zip文件路径作为参数
  • 使用ZipInputStream的getNextEntry方法获取zip文件的每个条目ZipEntry
  • 循环处理每个zip条目,获取条目的名称和文件内容,并将内容写入目标目录
  • 关闭流对象

  • 示例代码
    创建zip工具类:
    1. 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
 
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表