2013-07-08 24 views
8

so come creare archivio zip:Come creare zip con compressione 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(); 
    } 
} 

Ma non ho idea di come utilizzare la compressione LZMA.

Ho trovato questo progetto: https://github.com/jponge/lzma-java che crea file compresso ma non so come dovrei combinarlo con la mia soluzione esistente.

+0

Né Zip util di Java né Commons-Compress compressione LZMA supporto per ogni ZipEntry. Probabilmente ci vorranno un giorno o due per estendere Commons-Compress per supportarlo usando il codice LZMA sopra e sovrascrivendo i controlli per STORAGE | SGONFIARE. In effetti, sarebbe bello se Commons-Compress potesse usare un approccio più estensibile in cui gli ZipArchiveEntries fossero estesi con il metodo di compressione richiesto, come ZipArchiveEntryLZMA. Così com'è, ci sono troppi controlli in ZipArchiveOutputStream per farlo rapidamente. –

risposta

0

C'è un esempio nel sito lei ha citato:

Adattato alle vostre esigenze:

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(); 

(non so se funziona, è solo l'utilizzo della biblioteca e la vostra snippet di codice)

+0

come ho detto nella mia domanda questo appena crea file compresso archivio non compresso – hudi

+0

Non è lo stesso? ... L'output è solo un flusso compresso di byte degli input, che viene poi scritto in un file. – matcauthon

+0

no, perché l'archivio potrebbe contenere molto file compresso – hudi

2

L'ultima versione di Apache Commons Compress (1.6 rilasciata il 23-ott-2013) supporta la compressione LZMA.

Dai uno sguardo allo http://commons.apache.org/proper/commons-compress/examples.html, in particolare quello relativo alla compressione/decompressione .7z.

Dire per esempio si desidera memorizzare una pagina html da una risposta HTTP e si desidera comprimere:

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();