Erik VV
Erik VV

Reputation: 125

Zipping files with ZipOutputStream gives inconsistent results

I want to zip a text file using the java.util.ZipOutputStream class. I found two examples on the internet explaining on how to do that. This led me to the two possible implementations shown below. While both methods produce 'healthy zip files', my problem is that on every run the binary content of the file is slightly different (around the 10th byte). Does someone know if

  1. This is intended behaviour
  2. There is a way to always produce exactly the same result

Here is my current code:

    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();
}

Upvotes: 0

Views: 693

Answers (1)

Neil Masson
Neil Masson

Reputation: 2689

Byte 10 starts the file modification date and so this will always differ. See Wikipedia for the details of the zip file format.

Upvotes: 3

Related Questions