Hi Sherman

The jarsigner tool contains these 2 methods to copy a ZipEntry into the signer 
jar:

private void writeEntry(ZipFile zf, ZipOutputStream os, ZipEntry ze)
throws IOException
{
    ZipEntry ze2 = new ZipEntry(ze.getName());
    ze2.setMethod(ze.getMethod());
    ze2.setTime(ze.getTime());
    ze2.setComment(ze.getComment());
    ze2.setExtra(ze.getExtra());
    if (ze.getMethod() == ZipEntry.STORED) {
        ze2.setSize(ze.getSize());
        ze2.setCrc(ze.getCrc());
    }
    os.putNextEntry(ze2);
    writeBytes(zf, ze, os);
}

/**
 * Writes all the bytes for a given entry to the specified output stream.
 */
private synchronized void writeBytes
    (ZipFile zf, ZipEntry ze, ZipOutputStream os) throws IOException {
    int n;

    InputStream is = null;
    try {
        is = zf.getInputStream(ze);
        long left = ze.getSize();

        while((left > 0) && (n = is.read(buffer, 0, buffer.length)) != -1) {
            os.write(buffer, 0, n);
            left -= n;
        }
    } finally {
        if (is != null) {
            is.close();
        }
    }
}

Several questions:

1. Why cannot I just call os.putNextEntry(ze) or at least os.putNextEntry(new 
ZipEntry(ze))? Maybe some fields (say, compressed size) should not be copied 
over? If ze2 must be this way, shall I also copy the flag field?

2. In writeBytes(), why does the getSize() return value need to be used? 
Shouldn't we just transfer all bytes from is to os?

Thanks
Max

Reply via email to