InputStream.read (байт [], длина 0 )останавливается раньше?

Я писал что-то для чтения потока запросов (, содержащего сжатые данные )из входящего запроса HttpServletRequest (ниже ), однако кажется, что обычный метод чтения InputStream на самом деле не читает весь контент ?

Мой код был:

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

Во время тестирования я обнаружил, что иногда верхняя часть (, когда присутствует длина содержимого ), просто прекращала чтение части входящего потока запросов и оставляла оставшуюся часть «полученного» массива байтов пустой. Если я просто заставлю его постоянно запускать другую часть оператора if, он будет нормально читаться, и все ожидаемые байты будут помещены в «получено».

Итак, похоже, что теперь я могу просто оставить свой код в покое с этим изменением, но кто-нибудь знает, почему обычный метод 'read' (byte[], int, int )' перестал читать? В описании сказано, что он может остановиться, если присутствует конец файла. Может ли быть так, что данные, сжатые с помощью gzip, просто включают байты, соответствующие любой сигнатуре для этого?

5
задан user unknown 13 August 2012 в 15:53
поделиться