使用 ZipOutputStream 压缩文件会产生不一致的结果

Zipping files with ZipOutputStream gives inconsistent results

我想使用 java.util.ZipOutputStream class 压缩一个文本文件。我在互联网上找到了两个示例,解释了如何做到这一点。这让我想到了下面显示的两种可能的实现方式。虽然这两种方法都会产生 'healthy zip files',但我的问题是在每个 运行 上,文件的二进制内容都略有不同(大约第 10 个字节)。有人知道

  1. 这是有意为之的行为
  2. 有一种方法可以始终产生完全相同的结果

这是我当前的代码:

    public byte[] getZipByteArray(String fileName) throws IOException
{
    byte[] result = new byte[0];
    byte[] buffer = new byte[1024];
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ZipOutputStream zos = new ZipOutputStream(baos);
    ZipEntry ze = new ZipEntry(fileName);
    zos.putNextEntry(ze);
    InputStream inputStream = ZipCompression.class.getResourceAsStream(fileName);

    int len;
    while ((len = inputStream.read(buffer)) > 0)
    {
        zos.write(buffer, 0, len);
    }
    zos.closeEntry();
    zos.close();
    result = baos.toByteArray();
    return result;
}

public byte[] ZipByteArrayBuffered(String fileName) throws IOException
{
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream);
    ZipOutputStream zipOutputStream = new ZipOutputStream(bufferedOutputStream);

    File file = new File(fileName);
    InputStream fileInputStream = ZipCompression.class.getResourceAsStream(file.getName());
    zipOutputStream.putNextEntry(new ZipEntry(file.getName()));

    IOUtils.copy(fileInputStream, zipOutputStream);

    fileInputStream.close();
    zipOutputStream.closeEntry();

    if (zipOutputStream != null)
    {
        zipOutputStream.finish();
        zipOutputStream.flush();
        IOUtils.closeQuietly(zipOutputStream);
    }
    IOUtils.closeQuietly(bufferedOutputStream);
    IOUtils.closeQuietly(byteArrayOutputStream);
    return byteArrayOutputStream.toByteArray();
}

字节 10 开始文件修改日期,因此这总是不同的。有关 zip 文件格式的详细信息,请参阅 Wikipedia