在 Java 中解压压缩的 ubuntu lz4 文件
Decompress compressed ubuntu lz4 file in Java
我从 Dockerfile 构建镜像:
FROM ubuntu
RUN apt-get update
然后将图像保存到我的本地计算机,例如我得到了这个文件:
archive.ubuntu.com_ubuntu_dists_bionic_restricted_binary-amd64_Packages.lz4
我正在尝试解压缩 ubuntu 仿生 lz4 文件 Java lz4-java:
LZ4Factory factory = LZ4Factory.fastestInstance();
byte[] encoded = Files.readAllBytes(Paths.get("<Path to file>"));
final int compressedLength = data.length;
LZ4Compressor compressor = factory.fastCompressor();
byte[] restored = new byte[compressedLength];
LZ4SafeDecompressor decompressor2 = factory.safeDecompressor();
decompressor2.decompress(data, 0, compressedLength, restored, 0);
我使用这个依赖:
<dependency>
<groupId>org.lz4</groupId>
<artifactId>lz4-java</artifactId>
<version>1.5.1</version>
</dependency>
但我仍然遇到这个异常:
Exception in thread "main" net.jpountz.lz4.LZ4Exception: Error decoding offset 4 of input buffer
at net.jpountz.lz4.LZ4JNISafeDecompressor.decompress(LZ4JNISafeDecompressor.java:38)
at net.jpountz.lz4.LZ4SafeDecompressor.decompress(LZ4SafeDecompressor.java:74)
at org.whitesource.fs.Main.main(Main.java:89)
假设您的存档使用官方 LZ4 帧格式,
你可能更喜欢 this LZ4 Java version 支持 LZ4 帧格式。
我将此方法写入 decompress/uncompress lz4 文件并将字符串写入新的输出文件
import org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorInputStream;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
.....
public File uncompressLz4File(File lz4File) {
File lz4output = new File(lz4File.getParent() + Constants.SYS_FILE_SEPARATOR + "lz4Output.txt");
try (InputStream fin = Files.newInputStream(lz4File.toPath());
BufferedInputStream in = new BufferedInputStream(fin);
OutputStream out = Files.newOutputStream(Paths.get(lz4output.getAbsolutePath()));
FramedLZ4CompressorInputStream zIn = new FramedLZ4CompressorInputStream(in)
) {
int n;
zIn.getCompressedCount();
byte[] b = new byte[1];
int uncompressedLength = zIn.read(b, 0, 1) == -1 ? -1 : b[0] & 255;
b[0] = (byte) uncompressedLength;
final byte[] buffer = new byte[uncompressedLength];
while (-1 != (n = zIn.read(buffer))) {
out.write(buffer, 0, n);
}
return lz4output;
} catch (Exception e) {
logger.warn("Failed to uncompress lz4 packages file '{}'. Exception message: '{}'", lz4File.getPath(), e.getMessage());
logger.debug("Exception: '{}'", e);
return null;
}
}
我从 Dockerfile 构建镜像:
FROM ubuntu
RUN apt-get update
然后将图像保存到我的本地计算机,例如我得到了这个文件:
archive.ubuntu.com_ubuntu_dists_bionic_restricted_binary-amd64_Packages.lz4
我正在尝试解压缩 ubuntu 仿生 lz4 文件 Java lz4-java:
LZ4Factory factory = LZ4Factory.fastestInstance();
byte[] encoded = Files.readAllBytes(Paths.get("<Path to file>"));
final int compressedLength = data.length;
LZ4Compressor compressor = factory.fastCompressor();
byte[] restored = new byte[compressedLength];
LZ4SafeDecompressor decompressor2 = factory.safeDecompressor();
decompressor2.decompress(data, 0, compressedLength, restored, 0);
我使用这个依赖:
<dependency>
<groupId>org.lz4</groupId>
<artifactId>lz4-java</artifactId>
<version>1.5.1</version>
</dependency>
但我仍然遇到这个异常:
Exception in thread "main" net.jpountz.lz4.LZ4Exception: Error decoding offset 4 of input buffer
at net.jpountz.lz4.LZ4JNISafeDecompressor.decompress(LZ4JNISafeDecompressor.java:38)
at net.jpountz.lz4.LZ4SafeDecompressor.decompress(LZ4SafeDecompressor.java:74)
at org.whitesource.fs.Main.main(Main.java:89)
假设您的存档使用官方 LZ4 帧格式, 你可能更喜欢 this LZ4 Java version 支持 LZ4 帧格式。
我将此方法写入 decompress/uncompress lz4 文件并将字符串写入新的输出文件
import org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorInputStream;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
.....
public File uncompressLz4File(File lz4File) {
File lz4output = new File(lz4File.getParent() + Constants.SYS_FILE_SEPARATOR + "lz4Output.txt");
try (InputStream fin = Files.newInputStream(lz4File.toPath());
BufferedInputStream in = new BufferedInputStream(fin);
OutputStream out = Files.newOutputStream(Paths.get(lz4output.getAbsolutePath()));
FramedLZ4CompressorInputStream zIn = new FramedLZ4CompressorInputStream(in)
) {
int n;
zIn.getCompressedCount();
byte[] b = new byte[1];
int uncompressedLength = zIn.read(b, 0, 1) == -1 ? -1 : b[0] & 255;
b[0] = (byte) uncompressedLength;
final byte[] buffer = new byte[uncompressedLength];
while (-1 != (n = zIn.read(buffer))) {
out.write(buffer, 0, n);
}
return lz4output;
} catch (Exception e) {
logger.warn("Failed to uncompress lz4 packages file '{}'. Exception message: '{}'", lz4File.getPath(), e.getMessage());
logger.debug("Exception: '{}'", e);
return null;
}
}