Как уже упоминалось, getContentLengthLong()
в URLConnection - ваша лучшая ставка, но она не всегда дает определенную длину. Это потому, что протокол HTTP (и другие, которые могут быть представлены URLConnection
), не всегда передает длину.
В случае HTTP длина динамического содержимого обычно заранее неизвестна - когда обычно отправляется заголовок content-length
. Вместо этого другой заголовок, transfer-encoding
, указывает, что используется «чанкованная» кодировка. При кодировании по частям длина всего ответа не указывается, и ответ отправляется обратно по частям, где указывается размер каждого куска. На практике сервер буферизует вывод сервлета. Всякий раз, когда буфер заполняется, отправляется другой кусок. Используя этот механизм, HTTP может фактически начать потоковую передачу ответа бесконечной длины.
Если размер файла превышает 2 ГБ, его размер не может быть представлен как int
, поэтому более старый метод getContentLength()
в этом случае вернет -1.