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();
Utilice J7Zip. Es un puerto java del SDK de LZMA. Lo encuentras aquí:
http://sourceforge.net/projects/p7zip/files/J7Zip/
alternativa
Utilice lzmajio.jar con las clases LzmaInputStream y LzmaOutputStream
Lo encuentras en github: