2013-07-08 17 views
8

wiem jak utworzyć archiwum zip:Jak stworzyć błyskawiczny z kompresją LZMA

import java.io.*; 
import java.util.zip.*; 
public class ZipCreateExample{ 
    public static void main(String[] args) throws Exception 
     // input file 
     FileInputStream in = new FileInputStream("F:/sometxt.txt"); 

     // out put file 
     ZipOutputStream out = new ZipOutputStream(new FileOutputStream("F:/tmp.zip")); 

     // name the file inside the zip file 
     out.putNextEntry(new ZipEntry("zippedjava.txt")); 

     // buffer size 
     byte[] b = new byte[1024]; 
     int count; 

     while ((count = in.read(b)) > 0) { 
      System.out.println(); 
      out.write(b, 0, count); 
     } 
     out.close(); 
     in.close(); 
    } 
} 

Ale nie mam pojęcia, w jaki sposób korzystać z kompresji LZMA.

Znalazłem ten projekt: https://github.com/jponge/lzma-java, który tworzy skompresowany plik, ale nie wiem, jak powinienem połączyć go z istniejącym rozwiązaniem.

+0

Ani Java util-Zip, ani fotografia Compress kompresji LZMA wsparcie dla każdego ZipEntry. Najprawdopodobniej zajmie to dzień lub dwa na rozszerzony Commons-Compress, aby go obsłużyć, wykorzystując powyższy kod LZMA i nadpisując czeki dotyczące PRZECHOWYWANIA | SIADAĆ. W rzeczywistości, byłoby miło, gdyby Commons-Compress mógł korzystać z bardziej rozszerzalnego podejścia, w którym rozszerzenia ZipArchiveEntries zostały rozszerzone o wymaganą metodę kompresji, taką jak ZipArchiveEntryLZMA. W tej chwili jest zbyt wiele sprawdzeń w ZipArchiveOutputStream, aby zrobić to szybko. –

Odpowiedz

0

Jest to przykład na stronie internetowej możesz wymienić:

dostosowane do Twoich potrzeb:

final File sourceFile = new File("F:/sometxt.txt"); 
final File compressed = File.createTempFile("lzma-java", "compressed"); 

final LzmaOutputStream compressedOut = new LzmaOutputStream.Builder(
     new BufferedOutputStream(new FileOutputStream(compressed))) 
     .useMaximalDictionarySize() 
     .useEndMarkerMode(true) 
     .useBT4MatchFinder() 
     .build(); 

final InputStream sourceIn = new BufferedInputStream(new FileInputStream(sourceFile)); 

IOUtils.copy(sourceIn, compressedOut); 
sourceIn.close(); 
compressedOut.close(); 

(nie wiem, czy to działa, to tylko korzystanie z biblioteki i swój fragment kodu)

+0

jak powiedziałem w moim pytaniu to po prostu utwórz skompresowany plik nie skompresowany archiwum – hudi

+0

Czy to nie to samo? ... Dane wyjściowe są po prostu skompresowanym strumieniem bajtów danych wejściowych, które następnie zapisywane są do pliku. – matcauthon

+0

nie jest, ponieważ archiwum może zawierać dużo skompresowanego pliku – hudi

2

Najnowsza wersja Apache Commons Compress (1.6 wydana 23-paź-2013) obsługuje kompresję LZMA.

Spójrz na http://commons.apache.org/proper/commons-compress/examples.html, szczególnie ten dotyczący .7z kompresji/dekompresji.

powiedzmy na przykład chcesz zapisać stronę HTML z odpowiedzi HTTP i chcesz go skompresować:

SevenZOutputFile sevenZOutput = new SevenZOutputFile(new File("outFile.7z")); 

File entryFile = new File(System.getProperty("java.io.tmpdir") + File.separator + "web.html"); 
SevenZArchiveEntry entry = sevenZOutput.createArchiveEntry(entryFile, "web.html"); 

sevenZOutput.putArchiveEntry(entry); 
sevenZOutput.write(rawHtml.getBytes()); 
sevenZOutput.closeArchiveEntry(); 
sevenZOutput.close();