JAVA - 使用LZ4库进行压缩/解压缩

时间:2016-11-23 12:02:01

标签: java lz4

我需要压缩/解压缩哈希表中包含的值。 由于LZ4似乎比GZip提供更好的性能,我正在尝试它。

这是我的代码。 特别是,table_data_cacheHashMap<String, List<Object>>,其中每个列表都有2个对象,只有第一个必须压缩

COMPRESSION

table_data_cache.forEach((kk,vv) -> {

            try{
                ByteArrayOutputStream b = new ByteArrayOutputStream();
                ObjectOutputStream o = new ObjectOutputStream(b);
                o.writeObject(vv.get(0));
                byte[] source = b.toByteArray();
                int decompressedLength = source.length;
                LZ4Factory factory = LZ4Factory.fastestInstance();
                LZ4Compressor compressor = factory.fastCompressor();
                int maxCompressedLength = compressor.maxCompressedLength(decompressedLength);
                byte[] compressed = new byte[maxCompressedLength];
                int compressLen = compressor.compress(source, 0, decompressedLength, compressed, 0, maxCompressedLength);
                 byte[] finalCompressedArray = Arrays.copyOf(compressed, compressLen);
                List<Object> list = new ArrayList<>();
                list.add(finalCompressedArray);
                list.add(vv.get(1));
                table_data_cache_compressed.put(kk, list);
            }catch(Exception e){
                e.printStackTrace();
            }

减压术

table_data_cache_compressed.forEach((kkk,vvv)->{
            List<AbstractClass> list = new ArrayList<>();
            try{

                LZ4Factory factory = LZ4Factory.fastestInstance();
                LZ4FastDecompressor decompressor = factory.fastDecompressor();

                byte[] src = (byte[])vvv.get(0);
                byte[] restored = "".getBytes();
                decompressor.decompress(src, restored);
                ObjectInputStream objectIn = new ObjectInputStream(new ByteArrayInputStream(restored));
                list = (List<AbstractClass>) objectIn.readObject();
                CacheStatus status = (CacheStatus) vvv.get(1);
                System.out.println("key: "+kkk+" ID1: "+list.get(0).getParameterValue("REG_MAP_ID", "int", section_name)+" timestamp: "+status.getTIMESTAMP());

            }
            catch(Exception e){
                e.printStackTrace();
            }
                CacheStatus status = (CacheStatus) vvv.get(1);
            System.out.println("key: "+kkk+" ID1: "+list.get(0).getParameterValue("REG_MAP_ID", "int", section_name)+" timestamp: "+status.getTIMESTAMP());
        });

但我有以下错误:

net.jpountz.lz4.LZ4Exception:解码输入缓冲区的偏移量1时出错

有什么问题?

0 个答案:

没有答案