我試過將LZ4的Java版本變成搜索引擎類的程序,試圖從大型文本文件中搜索數據。我只是簡單地壓縮輸出流並將其存儲到txt文件或文件中而沒有名稱。但是,我意識到所謂的壓縮文件的大小並沒有減小,但它的尺寸甚至比原始文件還要大。如何在Java中正確實現LZ4,Snappy或等效的壓縮技術?
最後我不得不訴諸zip4j,因爲它適用於我。
我想知道如何使用LZ4或Snappy罐來正確壓縮/解壓?
另外,我怎樣才能使用這種算法壓縮一個文件夾裏面有很多文件?
謝謝!
我試過將LZ4的Java版本變成搜索引擎類的程序,試圖從大型文本文件中搜索數據。我只是簡單地壓縮輸出流並將其存儲到txt文件或文件中而沒有名稱。但是,我意識到所謂的壓縮文件的大小並沒有減小,但它的尺寸甚至比原始文件還要大。如何在Java中正確實現LZ4,Snappy或等效的壓縮技術?
最後我不得不訴諸zip4j,因爲它適用於我。
我想知道如何使用LZ4或Snappy罐來正確壓縮/解壓?
另外,我怎樣才能使用這種算法壓縮一個文件夾裏面有很多文件?
謝謝!
我遇到過類似的問題。我試圖通過本地網絡以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;
}
你嘗試過的是什麼沒有奏效?從概念上講,只需使用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 –