Java如何为zip文件创建校验和?

此示例演示如何CheckedOutputStream用于创建zip文件的校验和。校验和可用于检测在向远程计算机的传输过程中数据是否已损坏。

package org.nhooo.example.zip;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import java.util.zip.CheckedOutputStream;
import java.util.zip.Adler32;

public class ZipWithChecksum {
    public static void main(String[] args) throws Exception {
        String target = "data-1.zip";

        try (FileOutputStream fos = new FileOutputStream(target);
             // 输出流还维护数据的校验和
             //被写。然后可以使用校验和来验证
             // 输出数据的完整性。
             CheckedOutputStream checksum =
                 new CheckedOutputStream(fos, new Adler32());
             ZipOutputStream zos =
                 new ZipOutputStream(new BufferedOutputStream(checksum))) {

            int size;
            byte[] buffer = new byte[1024];

            // 获取工作文件夹中的所有文本文件。
            File dir = new File(".");
            String[] files = dir.list(new FilenameFilter() {
                public boolean accept(File dir, String name) {
                    return name.endsWith(".txt");
                }
            });

            for (String file : files) {
                System.out.println("Compressing: " + file);

                try (FileInputStream fis = new FileInputStream(file);
                     BufferedInputStream bis =
                         new BufferedInputStream(fis, buffer.length)) {

                    // 在ZipOutputStream中放置一个新的ZipEntry
                    ZipEntry zipEntry = new ZipEntry(file);
                    zos.putNextEntry(zipEntry);

                    // 将数据读取到源文件的末尾并写入
                    // 到zip输出流。
                    while ((size = bis.read(buffer, 0, buffer.length)) > 0) {
                        zos.write(buffer, 0, size);
                    }

                    zos.closeEntry();
                }
            }

            // 打印校验和值
            long value = checksum.getChecksum().getValue();
            System.out.println("Checksum   : " + value);
        }
    }
}