我有一个网络应用程序,我需要能够为用户提供多个文件的存档。我已经设置了一个 generic ArchiveExporter,并做了一个ZipArchiveExporter. 做工精美!我可以将数据流式传输到我的服务器,存档数据并将其流式传输给用户,而无需使用太多内存,也不需要文件系统(我在 Google App Engine 上)。
然后我想起了 zip64 和 4gb zip 文件的整个过程。我的档案可能会变得非常大(高分辨率图像),因此我希望有一个选项可以避免使用 zip 文件来处理较大的输入。
我检查了一下org.apache.commons.compress.archivers.tar.TarArchiveOutputStream,以为我找到了我需要的东西!遗憾的是,当我检查文档时,遇到了一些错误;我很快发现你必须在流式传输时传递每个条目的大小。这是一个问题,因为数据正在流式传输给我,而无法事先知道其大小。
我尝试计算并返回来自 的写入字节export(),但预计之前的TarArchiveOutputStream大小TarArchiveEntry ,因此这显然不起作用。
我可以用一个ByteArrayOutputStream并在编写每个条目的内容之前完全阅读它,这样我就知道它的大小,但我的条目可能会变得非常大;这对于实例上运行的其他进程来说不太礼貌。
我可以使用某种形式的持久性,上传条目并查询数据大小。然而,这会浪费我的 google storage api 调用、带宽、存储和运行时间。
我知道这个问题问了几乎同样的事情,但他选择使用 zip 文件,并且没有更多相关信息。
创建包含未知大小条目的 tar 存档的理想解决方案是什么?
public abstract class ArchiveExporter<T extends OutputStream> extends Exporter { //base class
public abstract void export(OutputStream out); //from Exporter interface
public abstract void archiveItems(T t) throws IOException;
}
public class ZipArchiveExporter extends …Run Code Online (Sandbox Code Playgroud) 以下不编译。使这项工作的规范方法是什么?
let file = File::open(&args.path)?;
let reader = BufReader::new(file);
for line in reader.lines() {
if line?.contains(&args.pattern) {
println!("{}", line?);
}
}
Run Code Online (Sandbox Code Playgroud)
为了完整起见,这是错误消息:
let file = File::open(&args.path)?;
let reader = BufReader::new(file);
for line in reader.lines() {
if line?.contains(&args.pattern) {
println!("{}", line?);
}
}
Run Code Online (Sandbox Code Playgroud)