Ho scritto qualcosa per leggere un flusso di richiesta (contenente dati gzip) da una HttpServletRequest in arrivo ('richiesta' di seguito), tuttavia sembra che il normale metodo di lettura di InputStream non legga effettivamente tutto il contenuto?InputStream.read (byte [], lunghezza 0) si arresta in anticipo?
Il mio codice è:
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);
}
}
Quello che ho trovato durante i test è che a volte la parte superiore (per quando una lunghezza del contenuto è presente) sarebbe solo smettere di leggere in parte attraverso il flusso di richiesta in ingresso e lasciare il resto della matrice di byte 'ricevuti' vuota. Se faccio in modo che esegua sempre la parte else dell'istruzione if, legge bene e tutti i byte previsti vengono inseriti in 'received'.
Quindi, sembra che ora possa lasciare il mio codice solo con quel cambiamento, ma qualcuno ha idea del perché il normale metodo "read" (byte [], int, int) "ha smesso di leggere? La descrizione dice che potrebbe fermarsi se è presente una fine del file. Potrebbe essere che i dati gzippati capita di includere dei byte che corrispondono a qualsiasi firma?
BTW, si consiglia di dare un'occhiata a [GZIPInputStream] (http://docs.oracle.com/javase/7/docs/api/java/util/zip/GZIPInputStream.html). Invece di leggere tutto in un array di byte e quindi decomprimere i dati separatamente, è sufficiente avvolgere InputStream non elaborato in un GZIPInputStream e leggere direttamente i dati decompressi. –
Ah, la ragione per cui non lo facciamo direttamente è perché a volte l'input che riceviamo da altri sistemi non è effettivamente gzip anche se dovrebbe essere ... :) –