在AWS SDK for Java 2.x 中实施 ContentStreamProvider - AWS SDK for Java 2.x

在AWS SDK for Java 2.x 中实施 ContentStreamProvider

ContentStreamProvider 是AWS SDK for Java 2.x 中使用的抽象,用于允许多次读取输入数据。本主题将介绍如何为应用程序正确实施 ContentStreamProvider

适用于 Java 的 SDK 2.x 每次需要读取整个流时使用 ContentStreamProvider#newStream() 方法。要让此方法适用于整个流,返回的流必须始终位于内容的起始位置,并且必须包含相同的数据。

在接下来的章节中,我们将提供三种正确实现该行为的方法。

使用 mark()reset()

在下面的示例中,我们在读取开始之前在构造函数中使用 mark(int),以确保我们可以将流重置回开头。对于 newStream() 的每次调用,我们都会重置流:

public class MyContentStreamProvider implements ContentStreamProvider { private InputStream contentStream; public MyContentStreamProvider(InputStream contentStream) { this.contentStream = contentStream; this.contentStream.mark(MAX_LEN); } @Override public InputStream newStream() { contentStream.reset(); return contentStream; } }

如果 mark()reset() 不可用,则使用缓冲

如果您的流不直接支持 mark()reset(),您仍然可以使用前面显示的解决方案,方法是先将流封装在 BufferedInputStream 中:

public class MyContentStreamProvider implements ContentStreamProvider { private BufferedReader contentStream; public MyContentStreamProvider(InputStream contentStream) { this.contentStream = new BufferedInputStream(contentStream); this.contentStream.mark(MAX_LEN); } @Override public InputStream newStream() { contentStream.reset(); return contentStream; } }

创建新流

一种更简单的方法是:每次调用时都直接获取一个全新的数据流,并关闭前一个数据流:

public class MyContentStreamProvider implements ContentStreamProvider { private InputStream contentStream; @Override public InputStream newStream() { if (contentStream != null) { contentStream.close(); } contentStream = openStream(); return contentStream; } }