Java中可迭代的gzip压缩膨胀

Java中可迭代的gzip压缩膨胀,第1张

Java中可迭代的gzip压缩/膨胀

马克·阿德勒(Mark Adler)提出了这种方法,这一点值得称赞,这比我最初的回答要好得多。

package stack;import java.io.*;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import java.util.zip.CRC32;import java.util.zip.Deflater;public class BufferDeflate2 {        private static final byte[] GZIP_HEADER = new byte[] { 0x1f, (byte) 0x8b, Deflater.DEFLATED, 0, 0, 0, 0, 0, 0, 0 };        private final CRC32 crc = new CRC32();        private final Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION, true);        private final ByteArrayOutputStream buffer = new ByteArrayOutputStream();        private final byte[] transfer = new byte[1000];        private final int flushMode;        public BufferDeflate2(boolean syncFlush) {        flushMode = syncFlush ? Deflater.SYNC_FLUSH : Deflater.NO_FLUSH;        buffer.write(GZIP_HEADER, 0, GZIP_HEADER.length);    }        public ByteBuffer deflate(ByteBuffer in) {        // convert buffer to bytes        byte[] inBytes;        int off = in.position();        int len = in.remaining();        if( in.hasArray() ) { inBytes = in.array();        } else { off = 0; inBytes = new byte[len]; in.get(inBytes);        }        // update CRC and deflater        crc.update(inBytes, off, len);        deflater.setInput(inBytes, off, len);        while( !deflater.needsInput() ) { int r = deflater.deflate(transfer, 0, transfer.length, flushMode); buffer.write(transfer, 0, r);        }        byte[] outBytes = buffer.toByteArray();        buffer.reset();        return ByteBuffer.wrap(outBytes);    }        public ByteBuffer doFinal() {        // finish deflating        deflater.finish();        // write all remaining data        int r;        do { r = deflater.deflate(transfer, 0, transfer.length,         Deflater.FULL_FLUSH); buffer.write(transfer, 0, r);        } while( r == transfer.length );        // write GZIP trailer        writeInt((int) crc.getValue());        writeInt((int) deflater.getBytesRead());        // reset deflater        deflater.reset();        // final output        byte[] outBytes = buffer.toByteArray();        buffer.reset();        return ByteBuffer.wrap(outBytes);    }        private void writeInt(int v) {        System.out.println("v="+v);        buffer.write(v & 0xff);        buffer.write((v >> 8) & 0xff);        buffer.write((v >> 16) & 0xff);        buffer.write((v >> 24) & 0xff);    }        public static void main(String[] args) throws IOException {        File inFile = new File(args[0]);        File outFile = new File(args[0]+".test.gz");        FileChannel inChan = (new FileInputStream(inFile)).getChannel();        FileChannel outChan = (new FileOutputStream(outFile)).getChannel();        BufferDeflate2 def = new BufferDeflate2(false);        ByteBuffer buf = ByteBuffer.allocate(500);        while( true ) { buf.clear(); int r = inChan.read(buf); if( r==-1 ) break; buf.flip(); ByteBuffer compBuf = def.deflate(buf); outChan.write(compBuf);        }        ByteBuffer compBuf = def.doFinal();        outChan.write(compBuf);        inChan.close();        outChan.close();    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5439315.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存