2014-05-19 33 views
3

我試過將LZ4的Java版本變成搜索引擎類的程序,試圖從大型文本文件中搜索數據。我只是簡單地壓縮輸出流並將其存儲到txt文件或文件中而沒有名稱。但是,我意識到所謂的壓縮文件的大小並沒有減小,但它的尺寸甚至比原始文件還要大。如何在Java中正確實現LZ4,Snappy或等效的壓縮技術?

最後我不得不訴諸zip4j,因爲它適用於我。

我想知道如何使用LZ4或Snappy罐來正確壓縮/解壓?

另外,我怎樣才能使用這種算法壓縮一個文件夾裏面有很多文件?

謝謝!

+0

你嘗試過的是什麼沒有奏效?從概念上講,只需使用OutputStream封裝FileOutputStream即可提供壓縮,然後寫入該流。如果你正在寫文本,你可能會想用OutputStreamWriter或PrintWriter來包裝它。 https://oss.sonatype.org/service/local/repositories/releases/archive/org/xerial/snappy/snappy-java/1.1.0/snappy-java-1.1.0-javadoc.jar/!/org/ xerial/snappy/SnappyFramedOutputStream.html –

回答

4

我遇到過類似的問題。我試圖通過本地網絡以8192字節的塊發送一個大文件(〜709 MB)。我使用Lz4壓縮/解壓縮來降低網絡帶寬。

因此,假如你正在嘗試做類似的東西,這是我的建議:

下面是類似的常規例子的片斷,你會發現https://github.com/jpountz/lz4-java

private static int decompressedLength; 
private static LZ4Factory factory = LZ4Factory.fastestInstance(); 
private static LZ4Compressor compressor = factory.fastCompressor(); 

public static byte[] compress(byte[] src, int srcLen) { 
    decompressedLength = srcLen; 
    int maxCompressedLength = compressor.maxCompressedLength(decompressedLength); 
    byte[] compressed = new byte[maxCompressedLength]; 
    compressor.compress(src, 0, decompressedLength, compressed, 0, maxCompressedLength); 
    return compressed; 
} 

現在,如果你返回壓縮因爲它是有公平的機會,它可能有更大的長度比原始的未壓縮的數據。

因此可以如下進行修改:

private static int decompressedLength; 
private static LZ4Factory factory = LZ4Factory.fastestInstance(); 
private static LZ4Compressor compressor = factory.fastCompressor(); 

public static byte[] compress(byte[] src, int srcLen) { 
    decompressedLength = srcLen; 
    int maxCompressedLength = compressor.maxCompressedLength(decompressedLength); 
    byte[] compressed = new byte[maxCompressedLength]; 
    int compressLen = compressor.compress(src, 0, decompressedLength, compressed, 0, maxCompressedLength); 
    byte[] finalCompressedArray = Arrays.copyOf(compressed, compressLen); 
    return finalCompressedArray; 
} 

compressLen存儲實際壓縮長度和finalCompressedArray字節陣列(長度compressLen的)存儲的實際壓縮數據。它的長度,一般小於兩者長度壓縮字節數組和原未壓縮字節數組

現在你可以解壓縮規則的方式,如下finalCompressedArray字節數組:

private static LZ4FastDecompressor decompressor = factory.fastDecompressor(); 

public static byte[] decompress(byte[] finalCompressedArray, int decompressedLength) { 
    byte[] restored = new byte[decompressedLength]; 
    restored = decompressor.decompress(finalCompressedArray, decompressedLength); 
    return restored; 
} 
+0

對不起,遲遲不承認! – kdenz

+1

@ Ankit-如果解壓縮後我不知道字節數組的大小,什麼將解壓縮長度? – kit

1

A .jar文件是.zip文件。該zip文件格式不支持LZ4或Snappy。

+1

糟糕,錯誤的問題! :P我只是指我如何使用LZ4或Snappy來壓縮大型文本文件 – kdenz