aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/util/zip/DeflaterOutputStream.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/util/zip/DeflaterOutputStream.java')
-rw-r--r--libjava/java/util/zip/DeflaterOutputStream.java48
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;