小编Mee*_*tan的帖子

Java 创建包含未知大小条目的 tar 存档

我有一个网络应用程序,我需要能够为用户提供多个文件的存档。我已经设置了一个 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)

java io stream tar archive

6
推荐指数
1
解决办法
1562
查看次数

如何重用“结果”?

以下不编译。使这项工作的规范方法是什么?

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)

error-handling move rust rust-result

0
推荐指数
1
解决办法
103
查看次数

标签 统计

archive ×1

error-handling ×1

io ×1

java ×1

move ×1

rust ×1

rust-result ×1

stream ×1

tar ×1