getContentLengthLong() == -1 қолжетімді метадеректерде белгілі мазмұн ұзындығы жоқ екенін білдіреді. Ағынды оқуды жалғастырыңыз және алынған байттарды немесе анықталмаған үлгерімді көрсетіңіз; оны бос жауап деп санамаңыз және теріс өлшемді буфер бөлмеңіз.

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

Қосылым әлдеқашан конфигурацияланған және output шақырушыға тиесілі. Осы циклдің айналасында қосылым мен оқу күту уақыттарын және қолданбаның кез келген өлшем шегін сақтаңыз. I/O қатесі — сәтсіз жүктеу, аз байтпен сәтті аяқталу емес.

Ұзындықтарды бір деңгейде салыстырыңыз. HTTP/1.1 chunked кодтауы Content-Length орнын басуы мүмкін және оны HTTP іске асыруы декодтайды. Прокси оны қайта жақтауы мүмкін. Декомпрессия да қолданбаның декодталған байт санын кодталған Content-Length-тен өзгеше етуі мүмкін.

Егер Transfer-Encoding пен Content-Length екеуі де кездессе, ыңғайлы сан таңдамаңыз: HTTP жақтауы тасымалдау кодтауына басымдық береді және тіркесті ықтимал қате деп санайды. Бұл талдауды сәйкес іске асыруға қалдырыңыз.

HTTP шлюзі арқылы FTP URL оның нақты URLConnection әрекетін тексеруді қажет етеді; ол әрбір HTTP тақырып қатынасының әрбір JDK-де кәдімгі HTTP URL сияқты әрекет ететініне кепілдік бермейді. Метадеректер маңызды жерде ұзын мәнді length API қолданыңыз және дайын артефактіні шын мәнінде қажет ұзындық немесе бақылау сомасымен тексеріңіз. Денені оқу бұрын жоқ тақырыпты пайда қылмайды.

Қатысты мақалалар