当前位置: 首页 > 知识库问答 >
问题:

java - 在Java中如何实现Gzip的完整性校验(类似gzip -t <file> 命令)?

鞠修雅
2023-04-24

在Java中如何实现Gzip的完整性校验(类似gzip -t <file> 命令)?

已解决:

GZIPInputStream+FileOutputStream会自己检查是否完整,不完整会直接抛ZipException

    /**
     * 解压GZIP
     *
     * @param input
     * @param output
     * @throws IOException
     */
    public static void decompressGzip(File input, File output) throws IOException, ZipException {
        try (GZIPInputStream in = new GZIPInputStream(new FileInputStream(input))) {
            try (FileOutputStream out = new FileOutputStream(output)) {
                byte[] buffer = new byte[1024];
                int len;
                while ((len = in.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }
            }
        }
    }

共有2个答案

阳博赡
2023-04-24

可以试一下:

import java.util.zip.GZIPInputStream;
import java.util.zip.CRC32;

public class GzipChecksumValidator {
    public static boolean isValid(String gzipFilePath) throws Exception {
        byte[] buffer = new byte[1024];
        int count;
        long crc = 0; // 存储 CRC 值
        byte[] crcBytes = new byte[8]; // 存储 Gzip 文件头部中的 CRC 值

        try (GZIPInputStream gzipStream = new GZIPInputStream(new FileInputStream(gzipFilePath))) {
            while ((count = gzipStream.read(buffer)) != -1) {
                crc = new CRC32().getValue();
                crc.update(buffer, 0, count); // 更新 CRC 值
            }

            InputStream input = new FileInputStream(gzipFilePath);
            long skip = input.skip(8);
            if (skip != 8) {
                throw new IOException("Invalid Gzip File Format!");
            }
            int bytesRead = input.read(crcBytes);
            if (bytesRead != -1) {
                throw new IOException("Failed to read CRC32 from Gzip file header");
            }

            long crcFromHeader = new BigInteger(crcBytes).longValue(); // 从 Gzip 文件头部获取 CRC 值

            return crc == crcFromHeader;
        }
    }
}
顾光明
2023-04-24

gzip,zip, rar这一类的test命令的算法似乎是解压缩到/dev/null,判断是否有错误来决定的,由于不直接写入磁盘IO,所以速度极快。所以如果你要实现它的算法你也可以这么干。

Java 中使用null设备的输出流为OutputStream.nullOutputStream() (Java >= 11),所以你将gzip数据流输出到这个流中,检查是否抛出异常就行了

 类似资料:
  • 我一直在尝试实现解压以GZIP格式压缩的文本,下面是我实现的方法 现在我正在测试以下压缩文本的解决方案: 而且gzip格式也没有例外。我尝试了不同的方法,但仍然存在这个错误。也许有人知道我做错了什么?

  • 我想为我的web应用程序启用GZIP压缩。我在网上搜索了一下,发现了两个不同的选项: 在嵌入式容器中启用压缩,如Spring文档(https://docs.Spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html-latest section)中所述 使用解析器,如以下所述:ht

  • 是否有一个隐藏在Internet中的ByteBuffers方面的gzip放气库?允许我们推送原始数据然后提取放气数据的东西?我们已经搜索过了,但只找到了处理InputStreams和OutputStreams的库。 我们的任务是创建gzip过滤器,用于在管道架构中减少字节缓冲流。这是一个pull架构,其中最后一个元素从早期元素中提取数据。我们的gzip过滤器处理字节缓冲流,没有单个流对象可用。 我

  • 问题内容: 我找到了一些有关如何启用gzip的教程,但似乎对我没有任何帮助,所以我的问题是如何启用gzip。我在共享的Dreamhost托管服务器上,它正在运行PHP版本5.2,并且Apache从PHP信息中找到了这一行,这可能有所帮助吗? 我也找到了这条线 我不知道这是否与它有关。但这是我的第一个问题,其次,我有一个存放着Javscript文件的保管箱,我想知道是否可以将该文件压缩成文件,而不是

  • import "compress/gzip" gzip包实现了gzip格式压缩文件的读写,参见RFC 1952。 const ( NoCompression = flate.NoCompression BestSpeed = flate.BestSpeed BestCompression = flate.BestCompression

  • gzip 是 GNU zip 的缩写,它是一个 GNU 自由软件的文件压缩程序,也经常用来表示 gzip 这种文件格式。软件的作者是 Jean-loup Gailly 和 Mark Adler。 gzip 的基础 是DEFLATE,DEFLATE 是 LZ77 与哈夫曼编码的一个组合体。DEFLATE 最初是作为 LZW 以及其它受专利保护的数据压缩算法的替代版本而设计的,当时那些专利限制了 co