getContentLengthLong() == -1 esan nahi du ez dagoela edukien luzera ezagunik erabilgarri dauden metadatuetan. Jarraitu korrontea irakurtzen eta erakutsi jasotako byteak edo aurrerapen zehaztugabea; ez tratatu erantzun huts gisa eta ez esleitu tamaina negatiboko bufferrik.

long expected = connection.getContentLengthLong();
long received = 0;
byte[] buffer = new byte[8192];
try (InputStream input = connection.getInputStream()) {
    int count;
    while ((count = input.read(buffer)) != -1) {
        output.write(buffer, 0, count);
        received += count;
    }
}

Konexioa dagoeneko konfiguratuta dago eta output deitzailearen jabetzakoa da. Mantendu konexio eta irakurketa denbora-mugak eta aplikazioaren tamaina-muga edozein begizta honen inguruan. I/O errore bat deskarga huts egina da, ez byte gutxiagorekin osatze arrakastatsua.

Konparatu luzerak geruza berean. HTTP/1.1 chunked kodeketak Content-Length ordezkatu dezake eta HTTP inplementazioak deskodetzen du. Proxy batek berriz markatu dezake. Deskonexioak ere eragin dezake aplikazioaren deskodetako byte kopurua kodetutako Content-Length-etik desberdina izatea.

Transfer-Encoding eta Content-Length biak agertzen badira, ez aukeratu zenbaki komenigarri bat: HTTP markoak transferentzia-kodeketari lehentasuna ematen dio eta konbinazioa errore posible gisa tratatzen du. Utzi analisi hori inplementazio egoki bati.

HTTP atebide baten bidezko FTP URL batek bere URLConnection portaera zehatza egiaztatzea behar du; ez du bermatzen HTTP goiburu-sarbide bakoitzak HTTP URL arrunt batean bezala jokatuko duen JDK guztietan. Erabili balio luzeko length APIa metadatuek axola dutenean, eta balidatu osatutako artefaktua benetan behar den luzera edo kontrol-batuketaren aurka. Gorputza irakurtzeak ez du aurretik falta zen goiburua agerrarazten.

Erlazionatutako artikuluak