Un usuario carga un archivo grande en mi sitio web y quiero descomprimirlo y almacenarlo en un blob. Así que tengo un InputStream descomprimido y el blob quiere un InputStream. Sé cómo comprimir un InputStream a un Outputstream usando GZIPOutputStream, pero ¿cómo puedo pasar de la salida OutputStream gzip a la entrada requerida por el blob?¿Cómo puedo convertir un InputStream sin comprimir en un InputStream gzip'ed de manera eficiente?
La única forma que pude encontrar es utilizar ByteArrayOutputStream y luego crear un nuevo InputStream usando toByteArray. Pero eso significará que tengo una copia completa del archivo en la memoria. Y no me sorprendería si la implementación del controlador JDBC convirtiera la transmisión en un byte [] también, así tendría dos copias en la memoria.
Si no quiere el archivo completo en la memoria, escriba en un archivo. De la forma en que lo veo, los datos de gzip necesitan ir a alguna parte. –
Tenía la esperanza de transmitir directamente en el blob, así que nunca tuve que tener todo en la memoria. Parece que eso no funcionará, ya que necesito saber la longitud en el momento en que configuro el parámetro blob. Supongo que técnicamente, podría transmitir a un archivo, obtener el tamaño del archivo, y luego usarlo como un flujo de entrada en el blob para que nunca tenga que mantener todo en la memoria. En este caso, esencialmente usaría el sistema de archivos como mi memoria, lo que podría terminar siendo útil. –