

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# `ContentStreamProvider`在 AWS SDK for Java 2.x
<a name="content-stream-provider"></a>

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

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

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

## 使用 `mark()` 和 `reset()`
<a name="csp-impl-mark-reset"></a>

在下面的示例中，我们在读取开始之前在构造函数中使用 `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()` 不可用，则使用缓冲
<a name="csp-impl-unsupported-streams"></a>

 如果您的流不直接支持 `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;  
    }  
}
```

## 创建新流
<a name="csp-impl-new-stream"></a>

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

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