读取、加密、压缩和发送文件而无需重写

问题描述 投票:0回答:1

我有一个读取文件、压缩它、使用 AES 算法加密并将其发送到 S3 存储桶的任务。

我的实际代码的工作流程是:

  1. 读取文件并将其写入 zip 文件(
    Files.copy(filePath, zipOutputStream)
    来自
    java.nio.file
  2. 读取zip文件,加密并重写

1 和 2 的“伪代码”

    fileList.foreach(localFile => {
      zipOutputStream.putNextEntry(new ZipEntry(localFile.toPath.getFileName.toString))
      file.Files.copy(localFile.toPath, zipOutputStream)
      encryptAndReplace(localFile, someEncryptionConfig)
    })
  1. 读取加密的zip并将其发送到s3(
    FileInputStream 
    S3OutputStreamWrapper

我想在不重写文件 2 次的情况下完成所有这些步骤,并避免 IO 以节省时间。

我该如何优化我的工作流程?

如果我在步骤1中返回一个InputStream,而不是重写它。然后在我的步骤2中重新返回一个InputStream,然后将其发送到S3,这是否意味着我的2个方法将返回整个文件? 我的整个文件将存储在内存中? 如果我这样处理的话需要注意什么?

java scala io inputstream outputstream
1个回答
0
投票

您无需读写文件即可进行加密。使用

CipherOutputStream
,您可以一次性完成所有事情。

Cipher cipher = ...;
try (OutputStream fileOut = Files.newOutputStream(...);
        CipherOutputStream cipherOut = new CipherOutputStream(fileOut, cipher);
        ZipOutputStream zipOut = new ZipOutputStream(cipherOut)) {

    // add entries to zipOut
}

我认为你甚至可以用

fileOut
替换
S3OutputStreamWrapper
并一次性完成所有工作。

© www.soinside.com 2019 - 2024. All rights reserved.