2013-07-08 10 views
8

Ich weiß, wie Zip-Archiv erstellen:So erstellen zip mit LZMA-Kompression

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

Aber ich habe keine Ahnung, wie LZMA-Kompression verwenden.

Ich habe dieses Projekt gefunden: https://github.com/jponge/lzma-java das Erstellen von komprimierten Datei, aber ich weiß nicht, wie ich es mit meiner bestehenden Lösung kombinieren sollte.

+0

Weder Java Zip util noch Commons-Compress Unterstützung LZMA-Kompression für jeden ZipEntry. Es würde wahrscheinlich ein oder zwei Tage dauern, um Commons-Compress zu erweitern, um es zu unterstützen, indem Sie den obigen LZMA-Code verwenden und die Prüfungen für STORAGE | außer Kraft setzen DEFLATIEREN. In der Tat wäre es schön, wenn Commons-Compress einen erweiterbaren Ansatz verwenden könnte, bei dem die ZipArchiveEntries mit der erforderlichen Komprimierungsmethode wie ZipArchiveEntryLZMA erweitert wurden. In ZipArchiveOutputStream gibt es zu viele Überprüfungen, um dies schnell zu tun. –

Antwort

0

ein Beispiel in der Website ist, dass Sie erwähnt:

an Ihre Bedürfnisse angepasst:

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

(ich weiß nicht, ob es funktioniert, es ist nur die Nutzung der Bibliothek und Ihre Code Snippet)

+0

wie ich in meiner Frage diese nur komprimierte Datei nicht komprimierte Archiv erstellen – hudi

+0

Ist es nicht das gleiche? ... Die Ausgabe ist nur ein komprimierter Stream von Bytes der Eingabe (s), die dann in eine Datei geschrieben wird. – matcauthon

+0

nein es ist nicht, weil Archiv möglicherweise eine Menge komprimierte Datei enthält – hudi

2

Die neueste Version von Apache Commons Compress (1.6 veröffentlicht am 23-Oct-2013) unterstützt LZMA-Komprimierung.

Werfen Sie einen Blick auf http://commons.apache.org/proper/commons-compress/examples.html, speziell die eine .7z Komprimierung/Dekomprimierung.

zum Beispiel sagen Sie eine HTML-Seite von einer HTTP-Antwort speichern wollen, und Sie wollen es komprimieren:

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