Ограничение в Java HttpUrlConnection для получения длины содержимого - PullRequest
10 голосов
/ 19 февраля 2010

Именно так, я начал свой проект по созданию менеджера загрузок Java, который идет хорошо. Единственная проблема, которую я вижу в данный момент, это когда я запрашиваю длину содержимого URL. Когда я использую метод, предоставленный getContentLength HttpUrlConnection, он возвращает Int.

Это здорово, если бы я только когда-либо скачивал файлы размером менее 2 ГБ. Проделав еще несколько копаний и обнаружив, что java не поддерживает значения типа unsigned int, но даже в этом случае размер файла не должен превышать 4 ГБ.

Может ли кто-нибудь помочь мне в правильном направлении получения размера содержимого файла, превышающего 2 ГБ.

Заранее спасибо.

UPDATE

Спасибо за ваш ответ Elite Gentleman, я попробовал то, что вы предложили, но это продолжало возвращать нулевое значение, поэтому вместо этого я сделал

HttpURLConnection conn = (HttpURLConnection) absoluteUrl.openConnection();
conn.connect();
long contentLength = Long.parseLong(conn.getHeaderField("Content-Length"));

По какой-то причине простое использование conn.getRequestProperty всегда возвращало мне ноль

1 Ответ

18 голосов
/ 19 февраля 2010

Почему бы не попробовать использовать метод headerField для получения длины контента? т.е.

HttpURLConnection connection = new HttpURLConnection(...); 
long contentLength = Long.parseLong(connection.getHeaderField("Content-Length"));

Это эквивалентно connection.getContentLength, за исключением того, что возвращаемое значение имеет тип string. Это может дать точный результат длины в битах.

ОБНОВЛЕНИЕ: Я обновил его, чтобы использовать HeaderField вместо requestProperty ... спасибо автору вопроса.


Благодаря @FlasH от Ru вы можете добиться того же результата, используя JDK 7 и выше.

Это, по сути, вызывает новый метод URLConnection.getHeaderFieldLong(), который также был введен в JDK 7 и выше.

...