栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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();    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/463819.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号