当前位置: 首页 > 知识库问答 >
问题:

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

佴飞驰
2023-03-14

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

我们的问题是,当我们得到非常大的文件(例如800MB到1GB以上的文件大小)时,我们的应用程序将耗尽内存,因为整个文件被加载到内存中进行压缩和解压缩。

是否有任何骆驼API或java库可以帮助压缩/解压缩文件,而不需要将整个文件加载到内存中。

这里还有一个类似的未解问题

共有1个答案

左宁
2023-03-14

使用另一种方法:将文件流化。

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

获取一个InputStream到文件中,将一些GZipInputStream包装起来。每字节读取字节,写入outputstream

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);
    }
}
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更舒服的话,还可以将它们包装起来。它们自己管理缓冲,您可以读写而不是字节。请注意,只有当您读取的文件为行而不是其他格式时,这才是正确的。

 类似资料:
  • 我正在使用Julia的ZipFile包来提取和处理csv文件。没问题,但是当我遇到zip文件中的zip文件时,我也想处理它,但是遇到了一个错误。 Julia ZipFile文档如下:https://zipfilejl.readthedocs.io/en/latest/ 对如何做到这一点有什么想法吗?

  • 问题内容: 我想使用urllib下载文件,并在保存之前对文件进行解压缩。 这就是我现在所拥有的: 最终将写入空文件。我该如何实现自己的追求? 更新的答案: 问题答案: 在写完之后,但要传递给之前,您需要寻找到开始的地方。否则它将被模块从头读取,并显示为空文件。见下文:

  • Demo示例了如何利用第三方类库 ZipArchive 来解压和压缩.zip文件。Demo的演示过程是:先从网络下载一个.zip文件,然后解压它,最后再进行压缩。 代码的解释文章(英文)是:http://www.icodeblog.com/2012/08/13/unzipping-files-using-zip-archive/ [Code4App.com]

  • 问题内容: 我想使用Java代码将文件压缩为zip,rar和7z格式。我也想在指定位置解压缩这些文件。谁能告诉我如何在Java中使用7-zip压缩和解压缩文件? 问题答案: 我用过:sevenzipjbinding.jar sevenzipjbinding-Allplatforms.jar 我现在可以使用这些jar解压缩文件。 尝试使用此链接进行解压缩:http : //sourceforge.n

  • 问题内容: 我想将包含字符串的巨大文件合并为一个文件,并尝试使用nio2。我不想将整个文件加载到内存中,因此我尝试了BufferedReader: 我对此进行了尝试,但是,它的工作原理,字符串的格式(例如,新行等未复制到合并文件中): 如何在不将整个文件加载到内存的情况下将大型文件与NIO2合并? 问题答案: 如果您想有效地合并两个或多个文件,则应问自己,为什么要使用基础文件并执行该任务。 通过使

  • 我在S3中有一堆快速压缩的服务器日志,我需要在Elastic MapReduce上使用流式处理它们。如何告诉Amazon和Hadoop日志已经被压缩(在它们被拉入HFS之前!)以便它们可以在发送到流式映射器脚本之前被解压缩? 我能找到的唯一文档是:http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/HadoopData