簡體   English   中英

Java字節數組壓縮

[英]Java byte array compression

我正在嘗試使用Java DeflaterOutputStreamInflaterOutputStream類來壓縮字節數組,但兩者似乎均無法正常工作。 我認為我沒有正確實現它們。

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。顯着壓縮。

如果有人可以向我解釋我在做什么錯,將不勝感激。 另外,要解釋為什么我知道這些方法不能正常工作:無論我嘗試提供哪種大小的字節數組,它輸出的“壓縮”字節數組總是大於未壓縮的字節數組。

壓縮總是有開銷,以允許將來進行解壓縮。 如果壓縮沒有減少長度(數據是唯一的或幾乎唯一的),則輸出文件可能比輸入文件長

這將取決於您要壓縮的數據。 例如,如果我們采用一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM