[Kaffe] patch for Jar program
Moses DeJong
dejong at cs.umn.edu
Sun Feb 13 16:43:27 PST 2000
Attached in a patch for
libraries/extensions/tools/javalib/kaffe/tools/jar/Jar.java
that fixes the Jar implementation so that it only reads the
data from a file being added once, the current implementation
reads the data twice.
Here is the ChangeLog entry.
Sun Feb 13 Moses DeJong <mdejong at cs.umn.edu>
* libraries/extensions/tools/javalib/kaffe/tools/jar/Jar.java:
Changed CRC calculation on uncompressed Zip entries so that
the entry stream does not need to be read twice.
-------------- next part --------------
Index: libraries/extensions/tools/javalib/kaffe/tools/jar/Jar.java
===================================================================
RCS file: /cvs/kaffe/kaffe/libraries/extensions/tools/javalib/kaffe/tools/jar/Jar.java,v
retrieving revision 1.3
diff -u -r1.3 Jar.java
--- libraries/extensions/tools/javalib/kaffe/tools/jar/Jar.java 1999/10/15 22:53:13 1.3
+++ libraries/extensions/tools/javalib/kaffe/tools/jar/Jar.java 2000/02/13 23:56:15
@@ -995,7 +995,7 @@
// YIKES!! Watch out for the really ugly special case where
// we attempt to add the archive that we are writing to the
// archive we are writing to the archive we are writing.
- // You get the idea. There is not way to avoid this case
+ // You get the idea. There is no way to avoid this case
// when writing to stdout.
if (archive != null) {
@@ -1027,52 +1027,61 @@
ZipEntry ze = new ZipEntry(entryname);
long entryfile_length = entryfile.length();
- // Set some file attributes
+ // Set some entry attributes
if (compression) {
ze.setMethod(ZipEntry.DEFLATED); // compressed entry
} else {
ze.setMethod(ZipEntry.STORED); // uncompressed entry
ze.setSize(entryfile_length);
-
- // Calculate the CRC for this file if uncompressed
- CRC32 crc = new CRC32();
- InputStream in = new XPFileInputStream(entryfile);
- try {
- CheckedInputStream c = new CheckedInputStream(in, crc);
- readwriteStreams(c, new OutputStream() {
- public void write(int b) {
- }
- public void write(byte[] buf, int off, int len) {
- }
- });
- } finally {
- in.close();
- }
- ze.setCrc(crc.getValue());
+ ze.setCrc( 0 ); // set after stream is read/written to zip
}
- // Compress file and write it into the archive
- if (debug) {
- System.out.println("opening input file \"" + entryfile + "\"");
- }
zos.putNextEntry(ze);
+
if (verbose) {
// adding: file1 (in=16) (out=18) (deflated -12%)
vout.print("adding: " + entryname + " ");
vout.print("(in=" + entryfile_length + ") ");
}
+
+ // Write file into the archive, compressing if so requested
+ if (debug) {
+ System.out.println("opening input file \"" + entryfile + "\"");
+ }
+
InputStream in = new XPFileInputStream(entryfile);
+
+ // This is part of the ugly workaround for a design flaw
+ // in the JDK zip API, for uncompressed entries we
+ // are forced to calculate a CRC for the input stream
+ CRC32 crc = null;
+
+ if (! compression) {
+ crc = new CRC32();
+ in = new CheckedInputStream(in,crc);
+ }
+
try {
readwriteStreams(in, zos);
} finally {
in.close();
}
+ // ZIP design flaw workaround
+
+ if (! compression) {
+ ze.setCrc(crc.getValue());
+ }
+
+ // finish writing the entry to the stream
+ // this lets us access the compressed size
+ // attribute of the current ZipEntry
+
zos.closeEntry();
if (verbose) {
- // Find compressed size of entry adter it has been added
+ // Find compressed size of entry after it has been added
long unsize = ze.getSize();
long csize = ze.getCompressedSize();
More information about the kaffe
mailing list