1 2 29 34 35 package com.jcraft.jzlib; 36 import java.io.*; 37 38 public class ZInputStream extends FilterInputStream { 39 40 protected ZStream z=new ZStream(); 41 protected int bufsize=512; 42 protected int flush=JZlib.Z_NO_FLUSH; 43 protected byte[] buf=new byte[bufsize], 44 buf1=new byte[1]; 45 protected boolean compress; 46 47 protected InputStream in=null; 48 49 public ZInputStream(InputStream in) { 50 this(in, false); 51 } 52 public ZInputStream(InputStream in, boolean nowrap) { 53 super(in); 54 this.in=in; 55 z.inflateInit(nowrap); 56 compress=false; 57 z.next_in=buf; 58 z.next_in_index=0; 59 z.avail_in=0; 60 } 61 62 public ZInputStream(InputStream in, int level) { 63 super(in); 64 this.in=in; 65 z.deflateInit(level); 66 compress=true; 67 z.next_in=buf; 68 z.next_in_index=0; 69 z.avail_in=0; 70 } 71 72 75 76 public int read() throws IOException { 77 if(read(buf1, 0, 1)==-1) 78 return(-1); 79 return(buf1[0]&0xFF); 80 } 81 82 private boolean nomoreinput=false; 83 84 public int read(byte[] b, int off, int len) throws IOException { 85 if(len==0) 86 return(0); 87 int err; 88 z.next_out=b; 89 z.next_out_index=off; 90 z.avail_out=len; 91 do { 92 if((z.avail_in==0)&&(!nomoreinput)) { z.next_in_index=0; 94 z.avail_in=in.read(buf, 0, bufsize); if(z.avail_in==-1) { 96 z.avail_in=0; 97 nomoreinput=true; 98 } 99 } 100 if(compress) 101 err=z.deflate(flush); 102 else 103 err=z.inflate(flush); 104 if(nomoreinput&&(err==JZlib.Z_BUF_ERROR)) 105 return(-1); 106 if(err!=JZlib.Z_OK && err!=JZlib.Z_STREAM_END) 107 throw new ZStreamException((compress ? "de" : "in")+"flating: "+z.msg); 108 if((nomoreinput||err==JZlib.Z_STREAM_END)&&(z.avail_out==len)) 109 return(-1); 110 } 111 while(z.avail_out==len&&err==JZlib.Z_OK); 112 return(len-z.avail_out); 114 } 115 116 public long skip(long n) throws IOException { 117 int len=512; 118 if(n<len) 119 len=(int)n; 120 byte[] tmp=new byte[len]; 121 return((long)read(tmp)); 122 } 123 124 public int getFlushMode() { 125 return(flush); 126 } 127 128 public void setFlushMode(int flush) { 129 this.flush=flush; 130 } 131 132 135 public long getTotalIn() { 136 return z.total_in; 137 } 138 139 142 public long getTotalOut() { 143 return z.total_out; 144 } 145 146 public void close() throws IOException{ 147 in.close(); 148 } 149 } 150 | Popular Tags |