gpt4 book ai didi

java - 在 apache Camel 中压缩和解压缩大文件而不将整个文件加载到内存中

转载 作者:行者123 更新时间:2023-12-05 04:06:06 24 4
gpt4 key购买 nike

我们使用 Apache Camel 来压缩和解压缩我们的文件。我们使用标准的 .marshal().gzip().unmarshall().gzip() API。

我们的问题是,当我们获得非常大的文件时,比如 800MB 到超过 1GB 的文件大小,我们的应用程序会耗尽内存,因为整个文件正在加载到内存中进行压缩和解压缩。

是否有任何 camel api 或 java 库可以帮助压缩/解压缩文件而无需将整个文件加载到内存中。

还有一个类似的悬而未决的问题here

最佳答案

解释

使用不同的方法:流式传输文件。

也就是说,不要将它完全加载到内存中,而是逐字节读取,同时逐字节写回。

获取文件的 InputStream,将一些 GZipInputStream 包裹起来。按字节读取字节,写入 OutputStream

如果你想压缩文件则相反。然后用一些 GZipOutputStream 包装 OutputStream


代码

示例使用 Apache Commons Compress但所有库的代码逻辑都保持不变。

解压一个 gz 存档:

Path inputPath = Paths.get("archive.tar.gz");
Path outputPath = Paths.get("archive.tar");

try (InputStream fin = Files.newInputStream(inputPath );
OutputStream out = Files.newOutputStream(outputPath);) {
GZipCompressorInputStream in = new GZipCompressorInputStream(
new BufferedInputStream(fin));

// Read and write byte by byte
final byte[] buffer = new byte[buffersize];
int n = 0;
while (-1 != (n = in.read(buffer))) {
out.write(buffer, 0, n);
}
}

打包为 gz 存档:

Path inputPath = Paths.get("archive.tar");
Path outputPath = Paths.get("archive.tar.gz");

try (InputStream in = Files.newInputStream(inputPath);
OutputStream fout = Files.newOutputStream(outputPath);) {
GZipCompressorOutputStream out = new GZipCompressorOutputStream(
new BufferedOutputStream(fout));

// Read and write byte by byte
final byte[] buffer = new byte[buffersize];
int n = 0;
while (-1 != (n = in.read(buffer))) {
out.write(buffer, 0, n);
}
}

如果您觉得使用起来更舒服,也可以将 BufferedReaderPrintWriter 包裹起来。他们自己管理缓冲,您可以读写 line 而不是 byte。请注意,这仅在您读取包含行而不是其他格式的文件时才有效。

关于java - 在 apache Camel 中压缩和解压缩大文件而不将整个文件加载到内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50295432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com