getContentLengthLong() == -1 mavjud metama'lumotlarda ma'lum kontent uzunligi yo'qligini bildiradi. Oqimni o'qishni davom eting va qabul qilingan baytlarni yoki noaniq jarayonni ko'rsating; uni bo'sh javob deb hisoblamang va manfiy o'lchamli bufer ajratmang.

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

Ulanish allaqachon sozlangan va output chaqiruvchiga tegishli. Ushbu sikl atrofida ulanish va o'qish taym-autlarini hamda ilovaning har qanday o'lcham chegarasini saqlang. Kiritish/chiqarish xatosi muvaffaqiyatsiz yuklab olish, kamroq bayt bilan muvaffaqiyatli tugatish emas.

Uzunliklarni bir qatlamda solishtiring. HTTP/1.1 chunked kodlamasi Content-Length o'rnini bosishi mumkin va uni HTTP amalga oshirishi dekodlaydi. Proksi uni qayta ramkalashi mumkin. Dekompressiya ham ilovaning dekodlangan bayt sonini kodlangan Content-Length dan farqli qilishi mumkin.

Agar Transfer-Encoding ham, Content-Length ham ko'rinsa, qulay raqam tanlamang: HTTP ramkalash uzatish kodlashiga ustunlik beradi va kombinatsiyani mumkin bo'lgan xato deb hisoblaydi. Bu tahlilni mos amalga oshirishga qoldiring.

HTTP shlyuzi orqali FTP URL uning aniq URLConnection xatti-harakatini tekshirishni talab qiladi; u har bir JDK da har bir HTTP sarlavha kirishining oddiy HTTP URL kabi ishlashini kafolatlamaydi. Metama'lumot muhim bo'lgan joyda long qiymatli length API dan foydalaning va tayyor artefaktni haqiqatda talab qilinadigan uzunlik yoki checksum bilan tekshiring. Tanani o'qish avval yo'q bo'lgan sarlavhani paydo qilmaydi.

O'xshash maqolalar