不解压修改压缩文件内容

简介: 在java中,可以不解压压缩包就修改压缩包中文件的内容。


image.png

在java中,可以不解压压缩包就修改压缩包中文件的内容。

/**
     * 图片输出使用(现在earlying中模板使用)
     *
     * @param fileMessage
     * @return
     * @throws UnsupportedEncodingException
     */
    @GetMapping("/downloadApplication")
    public String downloadApplication(FileMessage fileMessage) throws Exception {
        // 获取HttpServletResponse
        HttpServletResponse response =
            ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
        // 下载路径
        String downUrl = fileMessage.getFileDownloadUri();
        if (downUrl != null) {
            // 复制模板文件 生成uuid服务名
            UUID uuid = UUID.randomUUID();
            String newRarFile = "/home/common_files/" + uuid + ".zip";
            // 开始复制
            updateZipFile(downUrl, newRarFile, fileMessage.getId());
            // 设置文件路径
            File file = new File(newRarFile);
            if (file.exists()) {
                byte[] buffer = new byte[1024];
                FileInputStream fis = null;
                BufferedInputStream bis = null;
                try {
                    fis = new FileInputStream(file);
                    bis = new BufferedInputStream(fis);
                    OutputStream os = response.getOutputStream();
                    int i = bis.read(buffer);
                    while (i != -1) {
                        os.write(buffer, 0, i);
                        i = bis.read(buffer);
                    }
                    return "";
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (bis != null) {
                        try {
                            bis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (fis != null) {
                        try {
                            fis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        return "";
    }
    public void updateZipFile(String inputName, String outPutName, String id) throws IOException {
        ZipFile zipFile = new ZipFile(inputName);
        // 复制为新zip
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outPutName));
        // 遍历所有文件复制
        for (Enumeration e = zipFile.entries(); e.hasMoreElements();) {
            ZipEntry entryIn = (ZipEntry)e.nextElement();
            if (!entryIn.getName().equalsIgnoreCase("myMapApp/config.js")) {
                // zos.putNextEntry(entryIn);
                zos.putNextEntry(new ZipEntry(entryIn.getName()));
                InputStream is = zipFile.getInputStream(entryIn);
                byte[] buf = new byte[1024];
                int len;
                while ((len = is.read(buf)) > 0) {
                    zos.write(buf, 0, (len < buf.length) ? len : buf.length);
                }
            }
            // 当前文件需要复写
            else {
                zos.putNextEntry(new ZipEntry("myMapApp/config.js"));
                InputStream is = zipFile.getInputStream(entryIn);
                byte[] buf = new byte[1024 * 5];
                int len;
                while ((len = (is.read(buf))) > 0) {
                    String s = new String(buf);
                    if (s.contains("let appid=")) {
                        buf = s.replaceAll("let appid=", "let appid=\"" + id + "\"").getBytes();
                        s = s.replaceAll("let appid=", "let appid=\"" + id + "\"");
                    }
                    if (s.contains("let service=")) {
                        buf = s.replaceAll("let service=", "let service=\"" + instanceId + "\"").getBytes();
                    }
                    zos.write(buf, 0, (len < buf.length) ? len : buf.length);
                }
            }
            zos.closeEntry();
        }
        zos.close();
    }

这里有一个问题。

1. zos.putNextEntry(entryIn); 这行代码会报错 --java.util.zip.ZipException: invalid entry compressed size (expected 1466196 but got 1499165 bytes)
2. 原因是复制过程中 压缩方式不同导致流的字节对应不上 所以需要用以下代码。
3. zos.putNextEntry(new ZipEntry(entryIn.getName()));


相关文章
|
前端开发 算法 API
直接在前端做 zip 压缩/解压
前段时间研究前端是如何解析 excel 表格的时候了解到 jszip 这个库,可以直接在前端对 zip 包进行压缩和解压缩,今天稍微水一篇。
|
4月前
|
Linux
c创建压缩文件,用于压缩模式,-v显示压缩进程,-x解压模式,-f创建的文件,解压文件,tar -cvf
c创建压缩文件,用于压缩模式,-v显示压缩进程,-x解压模式,-f创建的文件,解压文件,tar -cvf
|
6月前
|
数据安全/隐私保护 Python
Pyzipper解压文件和压缩文件夹方法
Pyzipper解压文件和压缩文件夹方法
190 1
|
12月前
|
Java
Java实现zip文件压缩:单个文件、文件夹以及文件和文件夹的压缩
Java实现zip文件压缩:单个文件、文件夹以及文件和文件夹的压缩
|
Java 程序员
批量压缩16万个文件夹为压缩包(.zip格式)
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
274 0
批量压缩16万个文件夹为压缩包(.zip格式)
|
Linux
解压 .solitairetheme8 文件
解压 .solitairetheme8 文件
100 0
最新!压缩为rar格式方法,目前只能用:WinRAR压缩工具-rar压缩格式的版权所有者。
最新!压缩为rar格式方法,目前只能用:WinRAR压缩工具-rar压缩格式的版权所有者。
242 0
最新!压缩为rar格式方法,目前只能用:WinRAR压缩工具-rar压缩格式的版权所有者。