2014-09-12 69 views
0

我有一个压缩的文件。Inflater获取压缩方法

使用Inflater类,我可以解压缩它,但是当我使用Deflater再次压缩它时,两个文件都不相同。

我已经试图改变压缩级别最好...

public static String compress(byte[] rawData) 
{ 
    Deflater compressor = new Deflater(); 

    byte[] byteBuffer = new byte[1024]; 
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(
      rawData.length); 

    compressor.setInput(rawData); 
    compressor.setLevel(Deflater.BEST_COMPRESSION); 
    compressor.finish(); 

    while (!compressor.finished()) 
    { 
     outputStream.write(byteBuffer, 0, 
       new Integer(compressor.deflate(byteBuffer))); 
    } 

    return new String(outputStream.toByteArray()); 
} 

...,结果是更接近原始。

这里是我的吹气代码:

public static String decompress(byte[] compressed) 
     throws DataFormatException 
{ 
    Inflater decompressor = new Inflater(); 

    byte[] byteBuffer = new byte[1024]; 
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(
      compressed.length); 

    decompressor.setInput(compressed); 

    while (!decompressor.finished()) 
    { 
     outputStream.write(byteBuffer, 0, 
       new Integer(decompressor.inflate((byteBuffer)))); 
    } 

    return new String(outputStream.toByteArray()); 
} 

我如何找出哪些选项已初步被以重建从解压一个原始文件使用?我新近压缩的文件不符合规定。

+0

出于好奇,你为什么需要这样做? – Boann 2014-09-12 17:25:38

+0

@Boann:我得到了一个带有脚本的压缩文件,我想要修改和重建。没有关于它的详细信息 – BullyWiiPlaza 2014-09-12 17:34:02

+0

@ user3764804但是,为什么它应该使用什么精确的压缩器设置,只要它可以通过任何兼容的解压缩器进行解压缩? – Boann 2014-09-12 17:35:42

回答

1

我强烈怀疑你的问题是由这一行造成的:

return new String(outputStream.toByteArray()); 

String(byte[])构造函数使用一个未指定的依赖于平台的字符集,其可以任意破坏了二进制数据转换字节字符,因为不是所有可能的字节相当于以有效的字符。不保证new String(someBytes).getBytes()等于someBytes。您应该返回字节数组。

+0

是的! :) 转换为字符串搞砸了,谢谢很多人! 文件现在完全相同。 – BullyWiiPlaza 2014-09-12 18:24:49

+0

+1好答案! – EvenPrime 2014-09-12 18:25:04