java 7zip lzma

Cómo usar LZMA SDK para comprimir/descomprimir en Java



7zip (5)

Aquí hay ejemplos probados de cómo usar la biblioteca java pura de XZ Utils para empaquetar y descomprimir archivos XZ con el algoritmo de compresión LZMA2 con gran proporción.

import org.tukaani.xz.*; // CompressXz public static void main(String[] args) throws Exception { String from = args[0]; String to = args[1]; try (FileOutputStream fileStream = new FileOutputStream(to); XZOutputStream xzStream = new XZOutputStream( fileStream, new LZMA2Options(LZMA2Options.PRESET_MAX), BasicArrayCache.getInstance())) { Files.copy(Paths.get(from), xzStream); } } // DecompressXz public static void main(String[] args) throws Exception { String from = args[0]; String to = args[1]; try (FileInputStream fileStream = new FileInputStream(from); XZInputStream xzStream = new XZInputStream(fileStream, BasicArrayCache.getInstance())) { Files.copy(xzStream, Paths.get(to), StandardCopyOption.REPLACE_EXISTING); } } // DecompressXzSeekable (partial) public static void main(String[] args) throws Exception { String from = args[0]; String to = args[1]; int offset = Integer.parseInt(args[2]); int size = Integer.parseInt(args[3]); try (SeekableInputStream fileStream = new SeekableFileInputStream(from); SeekableXZInputStream xzStream = new SeekableXZInputStream(fileStream, BasicArrayCache.getInstance())) { xzStream.seek(offset); byte[] buf = new byte[size]; if (size != xzStream.read(buf)) { xzStream.available(); // let it throw the last exception, if any throw new IOException("Truncated stream"); } Files.write(Paths.get(to), buf); } }

http://www.7-zip.org/sdk.html Este sitio proporciona un SDK de LZMA para comprimir / descomprimir archivos, me gustaría darle una oportunidad pero estoy perdido.

¿Alguien tiene experiencia en esto? ¿O un tutorial? Gracias.


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


Puedes usar this biblioteca en su lugar. Está "desactualizado" pero aún funciona bien.

Dependencia maven

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

Primero debes crear un archivo con contenido para comenzar a comprimir. Puede utilizar this sitio web para generar texto aleatorio.

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


Respuesta corta: no

El 7zip sdk es antiguo y sin mantenimiento, y es solo un envoltorio JNI alrededor de la biblioteca de C ++. Una implementación de Java pura en una JVM moderna (1.7+) es tan rápida como la de C ++ y tiene menos dependencias y problemas de portabilidad.

Echa un vistazo a http://tukaani.org/xz/java.html

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

Los tipos que inventaron el formato XZ construyen una implementación java pura de los algoritmos de compresión / extracción de archivos XZ

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

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