diff options
Diffstat (limited to 'libjava/java/util/zip/DeflaterOutputStream.java')
-rw-r--r-- | libjava/java/util/zip/DeflaterOutputStream.java | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/libjava/java/util/zip/DeflaterOutputStream.java b/libjava/java/util/zip/DeflaterOutputStream.java index d4218fa5cc5..7a1dbb2cf66 100644 --- a/libjava/java/util/zip/DeflaterOutputStream.java +++ b/libjava/java/util/zip/DeflaterOutputStream.java @@ -50,13 +50,13 @@ public class DeflaterOutputStream extends FilterOutputStream protected void deflate () throws IOException { - while (true) + do { int len = def.deflate(buf, 0, buf.length); - if (len == 0 || len == -1) - break; - out.write(buf, 0, len); - } + if (len > 0) + out.write(buf, 0, len); + } + while (! def.needsInput()); } public DeflaterOutputStream (OutputStream out) @@ -78,23 +78,53 @@ public class DeflaterOutputStream extends FilterOutputStream public void finish () throws IOException { + if (inbufLength > 0) + { + def.setInput (inbuf, 0, inbufLength); + deflate (); + inbufLength = 0; + } def.finish(); - deflate (); + while (! def.finished ()) + { + int len = def.deflate(buf, 0, buf.length); + if (len > 0) + out.write(buf, 0, len); + } } public void write (int bval) throws IOException { - byte[] b = new byte[1]; - b[0] = (byte) bval; - write (b, 0, 1); + if (inbuf == null) + { + inbuf = new byte[128]; + } + else if (inbufLength == inbuf.length) + { + def.setInput (inbuf, 0, inbufLength); + deflate (); + inbufLength = 0; + } + inbuf[inbufLength++] = (byte) bval; } public void write (byte[] buf, int off, int len) throws IOException { + if (inbufLength > 0) + { + def.setInput (inbuf, 0, inbufLength); + deflate (); + inbufLength = 0; + } def.setInput (buf, off, len); deflate (); } + // Used, if needed, for write(int). + private byte[] inbuf; + // Used length of inbuf. + private int inbufLength; + // The retrieval buffer. protected byte[] buf; |