我有一个读取文件、压缩它、使用 AES 算法加密并将其发送到 S3 存储桶的任务。
我的实际代码的工作流程是:
Files.copy(filePath, zipOutputStream)
来自 java.nio.file
1 和 2 的“伪代码”
fileList.foreach(localFile => {
zipOutputStream.putNextEntry(new ZipEntry(localFile.toPath.getFileName.toString))
file.Files.copy(localFile.toPath, zipOutputStream)
encryptAndReplace(localFile, someEncryptionConfig)
})
FileInputStream
到S3OutputStreamWrapper
)我想在不重写文件 2 次的情况下完成所有这些步骤,并避免 IO 以节省时间。
我该如何优化我的工作流程?
如果我在步骤1中返回一个InputStream,而不是重写它。然后在我的步骤2中重新返回一个InputStream,然后将其发送到S3,这是否意味着我的2个方法将返回整个文件? 我的整个文件将存储在内存中? 如果我这样处理的话需要注意什么?
您无需读写文件即可进行加密。使用
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
并一次性完成所有工作。