Ich habe etwas geschrieben, um einen Anfragestream (der gziped Daten enthält) von einer eingehenden HttpServletRequest ('Anfrage' unten) zu lesen, aber es scheint, dass die normale InputStream Lesemethode nicht wirklich alle Inhalte liest?InputStream.read (Byte [], 0 Länge) stoppt früh?
Mein Code war:
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);
}
}
Was ich während des Tests war, dass manchmal das Oberteil (für, wenn eine Inhaltslänge vorhanden ist) würde nur aufhören teilweise durch die eingehende Anfrage Stream zu lesen und den Rest lassen des 'empfangenen' Byte-Array-Leerzeichens. Wenn ich es einfach immer den sonst Teil der if-Anweisung ausführen lassen, liest es sich gut und alle erwarteten Bytes werden in "erhalten" platziert.
So scheint es, als ob ich jetzt meinen Code mit dieser Änderung allein lassen kann, aber hat irgendjemand eine Idee warum die normale 'read' (byte [], int, int) 'Methode aufhört zu lesen? Die Beschreibung besagt, dass es anhalten kann, wenn ein Dateiende vorhanden ist. Könnte es sein, dass die gezippten Daten einfach nur Bytes enthielten, die mit der Signatur übereinstimmten?
BTW, möchten Sie vielleicht einen Blick auf [GZIPInputStream] (http://docs.oracle.com/javase/7/docs/api/java/util/zip/GZIPInputStream.html). Anstatt alles in ein Byte-Array zu lesen und dann die Daten separat zu dekomprimieren, können Sie den unformatierten InputStream einfach in einen GZIPInputStream schreiben und die dekomprimierten Daten direkt lesen. –
Ah, der Grund, warum wir das nicht direkt tun, ist, dass manchmal die Eingaben, die wir von anderen Systemen erhalten, nicht gezippt werden, obwohl es eigentlich sein soll ... :) –