文档章节

通过java.util.zip.ZipFile解析zip文件,遍历Entry生成新的Zip文件,新旧两个文件的MD5值不一样

qquunn
 qquunn
发布于 2018/05/14 08:09
字数 325
阅读 355
收藏 0

修改zip文件,删除ZipEntry,再还原ZipEntry后,想保持MD5值一样,可以采取直接修改Zip文件内容的方式。

zip文件格式参考

https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT

 


import java.io.*;
import java.security.NoSuchAlgorithmException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZipCopyDemo {

    public static void main(String[] args) throws IOException {

        File src = new File("d:/tmp/junit-4.12.jar");
        File dest = new File("d:/tmp/junit-4.12-2.jar");

        ZipFile zipSrc = new ZipFile(src);
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));

        Enumeration srcEntries = zipSrc.entries();
        while (srcEntries.hasMoreElements()) {
            ZipEntry srcentry = (ZipEntry) srcEntries.nextElement();
            ZipEntry destEntry = new ZipEntry(srcentry);
            zos.putNextEntry(destEntry);
            org.apache.commons.io.IOUtils.copy(zipSrc.getInputStream(srcentry), zos);
            zos.closeEntry();
        }

        zos.finish();
        zos.close();
        zipSrc.close();

        System.out.println(src.getAbsolutePath() + "\t md5=" + getMD5(readcontent(src)));
        System.out.println(dest.getAbsolutePath() + "\t md5=" + getMD5(readcontent(dest)));

    }

    private static byte[] readcontent(File file) throws IOException {
        try (InputStream in = new FileInputStream(file);) {
            return toByteArray(in, (int) file.length());
        }
    }

    public static byte[] toByteArray(InputStream input, int size) throws IOException {

        if (size == 0) {
            return new byte[0];
        }

        byte[] data = new byte[size];
        int offset = 0;
        int readed;

        while (offset < size && (readed = input.read(data, offset, size - offset)) != -1) {
            offset += readed;
        }

        if (offset != size) {
            throw new IOException("Unexpected readed size. current: " + offset + ", excepted: " + size);
        }

        return data;
    }

    public static String getMD5(byte[] source) {

        String s = null;

        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'a', 'b', 'c', 'd', 'e', 'f'};
        try {

            java.security.MessageDigest md = java.security.MessageDigest
                    .getInstance("MD5");
            md.update(source);

            byte tmp[] = md.digest();

            char str[] = new char[16 * 2];

            int k = 0;
            for (int i = 0; i < 16; i++) {
                byte byte0 = tmp[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            s = new String(str);

        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }

        return s;
    }

}

 

© 著作权归作者所有

qquunn
粉丝 7
博文 27
码字总数 6143
作品 0
广州
私信 提问
lianglongqun/app-pool-server

app-pool-server 项目介绍 上传文件到远程机房速度一般比较慢,例如100KB/s。使用putty工具上传war包(40M)到远程服务器需要几分钟。 为了提高效率,减少上传文件时间,我们可以尽量减少要传...

lianglongqun
2018/05/22
0
0
java实现文件的压缩和解压缩

压缩: package com.sichang.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; im......

别寒
2014/08/26
49
0
linux 备份、压缩、加密

tar -cvf - /home tar -xvf - 说明:把/home 拷贝到当前目录下,管道前半句把/home打包放到标准输出流中,后半句是把输入流-里的内容解包到当前目录。 tar是Linux常见的一种归档文件(原生不...

SibylY
2015/12/09
225
0
iOS-H5离线包本地缓存CCCandyWebCache

一、离线包缓存的简介 离线包缓存含几个包的概念: 预装包:指通过脚本文件在程序编译时期下载的包。 增量包:指通过包的文件比对,生成的diff文件(差量包) 全量包:指完整的包文件 CCCand...

走在路上的小二
2019/04/24
0
0
使用ZipOutputStream两次压缩相同的文件的压缩包MD5为什么不一样?

使用下面的工具类来压缩文件。 用的是上面的第一个压缩方法,两次得到的zip压缩文件的MD5为什么不同?解压后完全一样。甚至拿一个空的txt文件来压缩,结果执行两次得到的两个ZIP文件的MD5还是...

颖辉小居
2018/05/14
2K
5

没有更多内容

加载失败,请刷新页面

加载更多

Serverless 的喧哗与骚动(一)附Serverless行业发展回顾

作者 | 阿里中间件高级技术专家 许晓斌 《Maven实战》作者,曾负责 AliExpress 微服务架构演进,现在负责阿里集团 Serverless 技术研发落地。 导读:从 2016 年 AWS 发布 Lambda 以来,全世界...

阿里巴巴云原生
13分钟前
105
0
MySQL实战学习(二)

MySQL实战学习(二) MySQL中两种重要的日志 redo log 当数据库有一条记录需要更新时,InnoDB引擎会先把记录写到redolog中,同时更新内存。这个时候就算是更新完成了,同时,InnoDB会在适当时...

旺仔没馒头
17分钟前
27
0
12306智能刷票

代码下载: https://github.com/testerSunshine/12306 主要配置:TickerConfig.py Linux chrome安装: (chrome获取地址: https://www.chrome64bit.com/index.php/google-chrome-64-bit-for......

Hzhodor
19分钟前
28
0
ActiveMQ学习之SpringBoot整合ActiveMQ------>整合生产者

一、pom <!--聚合工程集成关系--> <!--统一整合第三方框架依赖信息--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</a......

冥焱
21分钟前
38
0
spring cloud gateway websocket 路由底层实现

最近再弄soul网关,发现soul网关中的websocket插件路径和项目中的不匹配,重写弄了个websocket插件,顺便把gateway中的websocket看了一下,直接开撸 一、WebsocketRoutingFilter 解析 初始化...

普普通通的小斌
28分钟前
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部