代码之家  ›  专栏  ›  技术社区  ›  Lev Knoblock

Java字节数组压缩

  •  1
  • Lev Knoblock  · 技术社区  · 6 年前

    我正在尝试使用Java DeflaterOutputStream InflaterOutputStream 类来压缩字节数组,但这两个类似乎都不能正常工作。我想我是在错误地执行它们。

    public static byte[] compress(byte[] in) {
        try {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            DeflaterOutputStream defl = new DeflaterOutputStream(out);
            defl.write(in);
            defl.flush();
            defl.close();
    
            return out.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(150);
            return null;
        }
    }
    
    public static byte[] decompress(byte[] in) {
        try {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            InflaterOutputStream infl = new InflaterOutputStream(out);
            infl.write(in);
            infl.flush();
            infl.close();
    
            return out.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(150);
            return null;
        }
    }
    

    下面是我用来压缩和解压缩字节数组的两种方法。我在网上看到的大多数实现都使用固定大小的缓冲区数组作为解压部分,但如果可能的话,我更愿意避免这种情况,因为如果我想要任何重要的压缩,我需要使缓冲区数组的大小为1。

    如果有人能向我解释我做错了什么,我会感激的。另外,为了解释为什么我知道这些方法不能正常工作:它输出的“压缩”字节数组总是比未压缩的字节数组大,不管我试图提供的字节数组大小如何。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Karol Dowbecki    6 年前

    这将取决于正在压缩的数据。例如,如果我们取一个数组 0 压缩良好的字节数:

    byte[] plain = new byte[10000];
    byte[] compressed = compress(plain);
    System.out.println(compressed.length); // 33
    byte[] result = decompress(compressed);
    System.out.println(result.length); // 10000
    
        2
  •  2
  •   Walter Marvin    6 年前

    压缩总是有开销,以便将来进行解压缩。如果压缩不会缩短长度(数据是唯一的或几乎是唯一的),那么输出文件可能比输入文件长。