getContentLengthLong() == -1 tähendab, et saadaolevates metaandmetes pole teadaolevat sisu pikkust. Jätka voo lugemist ja näita vastuvõetud baite või määramatut edenemist; ära käsitle seda tühja vastusena ega eralda negatiivse suurusega puhvrit.

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

Ühendus on juba seadistatud ja output kuulub kutsujale. Hoia ühenduse ja lugemise ajalõpud ning mis tahes rakenduse suuruspiirang selle tsükli ümber. I/O-viga on ebaõnnestunud allalaadimine, mitte edukas lõpetamine vähemate baitidega.

Võrdle pikkusi samal kihil. HTTP/1.1 chunked-kodeering võib Content-Length'i asendada ja HTTP-teostus dekodeerib selle. Puhverserver võib selle ümber raamistada. Dekompresseerimine võib samuti muuta rakenduse dekodeeritud baitide arvu kodeeritud Content-Length'ist erinevaks.

Kui esinevad nii Transfer-Encoding kui ka Content-Length, ära vali mugavat arvu: HTTP raamimine annab ülekandekodeeringule eesõiguse ja käsitleb kombinatsiooni võimaliku veana. Jäta see parsimine vastavale teostusele.

FTP URL HTTP-lüüsi kaudu nõuab selle konkreetse URLConnectioni käitumise kontrollimist; see ei taga, et iga HTTP-päise juurdepääs käitub nagu tavalisel HTTP URL-il igas JDK-s. Kasuta pika väärtusega length API-t seal, kus metaandmed loevad, ja valideeri valminud artefakt tegelikult nõutava pikkuse või kontrollsumma vastu. Sisu lugemine ei muuda varem puuduvat päist nähtavaks.

Seotud artiklid