2011-03-30 12 views

Respuesta

4

Echa un vistazo a los archivos LzmaAlone.java y LzmaBench.java en la carpeta Java/SevenZip del archivo zip de ese enlace que publicaste.

+0

que no entiendo, ¿No deberían haber hecho un javadoc al respecto? – lamwaiman1988

+2

Sí, deberían haber hecho alguna documentación (o un javadoc), pero a veces hay que mirar el código de ejemplo, que es a lo que te dirigí. –

38

Respuesta corta: no

el SDK 7zip es viejo y sin mantenimiento y es sólo un envoltorio JNI alrededor de la biblioteca de C++. Una implementación pura de Java en una JVM moderna (1.7+) es tan rápida como la de C++ y tiene menos dependencias y problemas de portabilidad.

Tenga una mirada en http://tukaani.org/xz/java.html

XZ es un formato de archivo basado en LZMA2 (una versión mejorada de LZMA)

Los chicos que inventó el formato XZ construir una aplicación Java pura de la compresión del archivo de XZ/Algoritmos de extracción

El formato de archivo XZ está diseñado para almacenar solo 1 archivo. Por lo tanto, primero debe comprimir/atacar las carpetas de origen en un único archivo descomprimido.

El uso de la biblioteca Java es tan fácil como esto:

FileInputStream inFile = new FileInputStream("src.tar"); 
FileOutputStream outfile = new FileOutputStream("src.tar.xz"); 

LZMA2Options options = new LZMA2Options(); 

options.setPreset(7); // play with this number: 6 is default but 7 works better for mid sized archives (> 8mb) 

XZOutputStream out = new XZOutputStream(outfile, options); 

byte[] buf = new byte[8192]; 
int size; 
while ((size = inFile.read(buf)) != -1) 
    out.write(buf, 0, size); 

out.finish(); 
+0

¿Puedes explicar tu respuesta corta? –

+3

Es una respuesta bastante antigua y la biblioteca que sugerí puede haber sido reemplazada por algo más nuevo/mejor. La esencia de esto es que el 7zip sdk es viejo y no se ha mantenido y es solo un contenedor JNI alrededor de la biblioteca C++. Una implementación pura de Java en una JVM moderna (1.7+) es tan rápida como la de C++ y tiene menos dependencias y problemas de portabilidad. Solo mis 2 centavos. –

+0

Espero que no le moleste mi edición: P –

2

Puede use la biblioteca this en su lugar. Está "desactualizado" pero aún funciona bien.

Maven dependencia

<dependency> 
    <groupId>com.github.jponge</groupId> 
    <artifactId>lzma-java</artifactId> 
    <version>1.2</version> 
</dependency> 

clase de utilidad

import lzma.sdk.lzma.Decoder; 
import lzma.streams.LzmaInputStream; 
import lzma.streams.LzmaOutputStream; 
import org.apache.commons.compress.utils.IOUtils; 

import java.io.*; 
import java.nio.file.Path; 

public class LzmaCompressor 
{ 
    private Path rawFilePath; 
    private Path compressedFilePath; 

    public LzmaCompressor(Path rawFilePath, Path compressedFilePath) 
    { 
     this.rawFilePath = rawFilePath; 
     this.compressedFilePath = compressedFilePath; 
    } 

    public void compress() throws IOException 
    { 
     try (LzmaOutputStream outputStream = new LzmaOutputStream.Builder(
       new BufferedOutputStream(new FileOutputStream(compressedFilePath.toFile()))) 
       .useMaximalDictionarySize() 
       .useMaximalFastBytes() 
       .build(); 
      InputStream inputStream = new BufferedInputStream(new FileInputStream(rawFilePath.toFile()))) 
     { 
      IOUtils.copy(inputStream, outputStream); 
     } 
    } 

    public void decompress() throws IOException 
    { 
     try (LzmaInputStream inputStream = new LzmaInputStream(
       new BufferedInputStream(new FileInputStream(compressedFilePath.toFile())), 
       new Decoder()); 
      OutputStream outputStream = new BufferedOutputStream(
        new FileOutputStream(rawFilePath.toFile()))) 
     { 
      IOUtils.copy(inputStream, outputStream); 
     } 
    } 
} 

En primer lugar hay que crear un archivo con contenido para empezar a comprimir. Puede usar el sitio web this para generar texto aleatorio.

Ejemplo compresión y descompresión

Path rawFile = Paths.get("raw.txt"); 
Path compressedFile = Paths.get("compressed.lzma"); 

LzmaCompressor lzmaCompressor = new LzmaCompressor(rawFile, compressedFile); 
lzmaCompressor.compress(); 
lzmaCompressor.decompress(); 
Cuestiones relacionadas