He estado escribiendo algo para leer un flujo de solicitud (que contiene datos comprimidos) de una HttpServletRequest entrante ('solicitud' a continuación), sin embargo, parece que el método de lectura de InputStream normal no lee realmente todo el contenido?InputStream.read (byte [], 0 longitud) se detiene antes de tiempo?
Mi código era:
InputStream requestStream = request.getInputStream();
if ((length = request.getContentLength()) != -1)
{
received = new byte[length];
requestStream.read(received, 0, length);
}
else
{
// create a variable length list of bytes
List<Byte> bytes = new ArrayList<Byte>();
boolean endLoop = false;
while (!endLoop)
{
// try and read the next value from the stream.. if not -1, add it to the list as a byte. if
// it is, we've reached the end.
int currentByte = requestStream.read();
if (currentByte != -1)
bytes.add((byte) currentByte);
else
endLoop = true;
}
// initialize the final byte[] to the right length and add each byte into it in the right order.
received = new byte[bytes.size()];
for (int i = 0; i < bytes.size(); i++)
{
received[i] = bytes.get(i);
}
}
Lo que encontré durante la prueba era que a veces la parte superior (para cuando una longitud de contenido está presente) acaba de dejar de leer parte del camino a través del torrente solicitud entrante y dejar el resto del conjunto de bytes 'recibido' en blanco. Si solo hago que ejecute la parte else de la declaración if en todo momento, se lee bien y todos los bytes esperados se colocan en 'received'.
Por lo tanto, parece que ahora puedo dejar mi código solo con ese cambio, pero ¿alguien tiene alguna idea de por qué dejó de leer el método normal de "lectura" (byte [], int, int)? La descripción dice que puede detenerse si hay un final de archivo presente. ¿Podría ser que los datos gzip solo incluyan bytes que coincidan con la firma que se parezca?
Por cierto, es posible que desee echar un vistazo a [GZIPInputStream] (http://docs.oracle.com/javase/7/docs/api/java/util/zip/GZIPInputStream.html). En lugar de leer todo en una matriz de bytes y luego descomprimir los datos por separado, puede envolver el InputStream sin procesar en un GZIPInputStream y leer los datos descomprimidos directamente. –
Ah, la razón por la que no hacemos eso directamente es porque a veces la entrada que recibimos de otros sistemas no está realmente comprimida aunque se supone que es ... :) –