本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
ContentStreamProvider
在 Amazon SDK for Java 2.x
ContentStreamProvider
是中使用的抽象, Amazon 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; } }