

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

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

`ContentStreamProvider`es una abstracción utilizada en el AWS SDK for Java 2.x para permitir múltiples lecturas de los datos de entrada. En este tema se explica cómo implementar un `ContentStreamProvider` correctamente para las aplicaciones.

El SDK para Java 2.x usa el método `ContentStreamProvider#newStream()` cada vez que necesita leer un flujo completo. Para que esto funcione en todo el flujo, el flujo devuelto debe estar siempre al principio del contenido y debe contener los mismos datos. 

En las secciones siguientes, proporcionaremos tres métodos para implementar correctamente este comportamiento.

## Utilice `mark()` y `reset()`
<a name="csp-impl-mark-reset"></a>

En el siguiente ejemplo, utilizamos `mark(int)` en el constructor antes de que comience la lectura para asegurarnos de que podemos restablecer el flujo al principio. Para cada invocación de `newStream()`, restablecemos el flujo:

```
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;  
    }  
}
```

## Uso de almacenamiento en búfer si `mark()` y `reset()` no están disponibles
<a name="csp-impl-unsupported-streams"></a>

 Si el flujo no es compatible con `mark()` y `reset()` directamente, puede seguir usando la solución que se mostró anteriormente envolviendo primero el flujo en un `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;  
    }  
}
```

## Creación de nuevos flujos
<a name="csp-impl-new-stream"></a>

Un método más sencillo consiste simplemente en obtener un nuevo flujo para los datos en cada invocación y cerrar el anterior:

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