Implementación de ContentStreamProvider en AWS SDK for Java 2.x - AWS SDK for Java 2.x

Implementación de ContentStreamProvider en AWS SDK for Java 2.x

ContentStreamProvider es una abstracción utilizada en AWS SDK for Java 2.x para permitir múltiples lecturas de 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()

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

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

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