压缩/解压缩字符串使用deflater

我想压缩/解压缩和序列化/反序列化字符串的内容。 我用下面的两个静态函数。

/** * Compress data based on the {@link Deflater}. * * @param pToCompress * input byte-array * @return compressed byte-array * @throws NullPointerException * if {@code pToCompress} is {@code null} */ public static byte[] compress(@Nonnull final byte[] pToCompress) { checkNotNull(pToCompress); // Compressed result. byte[] compressed = new byte[] {}; // Create the compressor. final Deflater compressor = new Deflater(); compressor.setLevel(Deflater.BEST_SPEED); // Give the compressor the data to compress. compressor.setInput(pToCompress); compressor.finish(); /* * Create an expandable byte array to hold the compressed data. * You cannot use an array that's the same size as the orginal because * there is no guarantee that the compressed data will be smaller than * the uncompressed data. */ try (ByteArrayOutputStream bos = new ByteArrayOutputStream(pToCompress.length)) { // Compress the data. final byte[] buf = new byte[1024]; while (!compressor.finished()) { final int count = compressor.deflate(buf); bos.write(buf, 0, count); } // Get the compressed data. compressed = bos.toByteArray(); } catch (final IOException e) { LOGWRAPPER.error(e.getMessage(), e); throw new RuntimeException(e); } return compressed; } /** * Decompress data based on the {@link Inflater}. * * @param pCompressed * input string * @return compressed byte-array * @throws NullPointerException * if {@code pCompressed} is {@code null} */ public static byte[] decompress(@Nonnull final byte[] pCompressed) { checkNotNull(pCompressed); // Create the decompressor and give it the data to compress. final Inflater decompressor = new Inflater(); decompressor.setInput(pCompressed); byte[] decompressed = new byte[] {}; // Create an expandable byte array to hold the decompressed data. try (final ByteArrayOutputStream bos = new ByteArrayOutputStream(pCompressed.length)) { // Decompress the data. final byte[] buf = new byte[1024]; while (!decompressor.finished()) { try { final int count = decompressor.inflate(buf); bos.write(buf, 0, count); } catch (final DataFormatException e) { LOGWRAPPER.error(e.getMessage(), e); throw new RuntimeException(e); } } // Get the decompressed data. decompressed = bos.toByteArray(); } catch (final IOException e) { LOGWRAPPER.error(e.getMessage(), e); } return decompressed; }

然而,相对于非压缩值是几个量级较慢即使我缓存解压缩型结果,并且如果确实需要的内容的值仅解压缩。

即,它是用于一个DOM状持久化的树状结构和XPath查询迫使字符串值的减压被约50倍,如果甚至不慢(不是真的基准,只是执行单元测试)。 我的笔记本电脑甚至一些单元测试后冻结(每次,检查了约5倍),因为Eclipse是不再因大量的磁盘I / O,什么没有响应。 我甚至设定的压缩级别Deflater.BEST_SPEED ,而其他的压缩级别可能会更好,也许我提供一种可以设置一个配置选项参数resources 。 也许我已经一团糟的东西了,因为我以前没有使用过的deflater。 我所在的字符串lenght是我甚至只有压缩含量> 10。

编辑:考虑到Deflater实例提取到似乎创造deflater和充气器实例的静态字段后是非常昂贵的性能瓶颈已经一去不复返了,也许没有微基准或像我看不到任何性能损失:-)我“M只是用一个新的输入之前重置deflater /吹气。

--------------解决方案-------------

您如何考虑使用更高级别的API器好像gzip。

这里是用于压缩的例子:

public static byte[] compressToByte(final String data, final String encoding)
throws IOException
{
if (data == null || data.length == 0)
{
return null;
}
else
{
byte[] bytes = data.getBytes(encoding);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream os = new GZIPOutputStream(baos);
os.write(bytes, 0, bytes.length);
os.close();
byte[] result = baos.toByteArray();
return result;
}
}

下面是解压缩的例子:

public static String unCompressString(final byte[] data, final String encoding)
throws IOException
{
if (data == null || data.length == 0)
{
return null;
}
else
{
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
GZIPInputStream is = new GZIPInputStream(bais);
byte[] tmp = new byte[256];
while (true)
{
int r = is.read(tmp);
if (r < 0)
{
break;
}
buffer.write(tmp, 0, r);
}
is.close();

byte[] content = buffer.toByteArray();
return new String(content, 0, content.length, encoding);
}
}

我们得到非常良好的性能和压缩比与此有关。

拉链API也是一种选择。

您的意见是正确的答案。

在一般情况下,如果一个方法将被频繁使用的,要消除的数据的任何分配和复制。 这往往意味着消除实例的初始化和其他设置,以静态变量或给构造函数。

使用静是比较容易的,但你可能会碰到问题,寿命(如你怎么知道什么时候清理静 - 做自己永远存在)。

这样做在构造函数中设置和初始化允许类的用户来确定对象的生命周期,并进行相应的清理。 你可以一次进入一个处理循环之前实例并退出后GC它。

分类:java的 时间:2015-03-15 人气:0
本文关键词: 压缩,JAVA
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.510 (s). 10 q(s)