Как создать zip со сжатием lzma
Я знаю, как создать zip-архив:
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();
}
}
Но я понятия не имею, как использовать сжатие lzma.
Я нашел этот проект: https://github.com/jponge/lzma-java который создает сжатый файл, но я не знаю, как мне следует объединить его с моим существующим решением.
2 ответа
Последняя версия Apache Commons Compress (1.6, выпущенная 23 октября 2013 г.) поддерживает сжатие LZMA.
Взгляните на http://commons.apache.org/proper/commons-compress/examples.html, особенно тот, что касается сжатия / распаковки.7z.
Например, вы хотите сохранить HTML-страницу из ответа HTTP и хотите сжать ее:
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();
На упомянутом вами сайте есть пример:
Адаптировано к вашим потребностям:
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();
(Я не знаю, работает ли это, это просто использование библиотеки и вашего фрагмента кода)
zip4jvm поддерживает сжатие LZMA для zip-архива.
ZipEntrySettings entrySettings = ZipEntrySettings.builder()
.compression(Compression.LZMA, CompressionLevel.NORMAL)
.lzmaEosMarker(true).build();
ZipSettings settings = ZipSettings.builder().entrySettingsProvider(fileName -> entrySettings).build();
Path file = Paths.get("F:/sometxt.txt");
Path zip = Paths.get("F:/tmp.zip");
ZipIt.zip(zip).settings(settings).add(file);