Mae getContentLengthLong() == -1 yn golygu nad oes hyd cynnwys hysbys yn y metadata sydd ar gael. Parhau i ddarllen y ffrwd a dangos y beitiau a dderbyniwyd neu gynnydd amhenodol; peidiwch â'i drin fel ymateb gwag na dyrannu byffer maint negyddol.

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

Mae'r cysylltiad eisoes wedi'i ffurfweddu ac mae output yn eiddo i'r galwr. Cadw'r terfynau amser cysylltu a darllen ac unrhyw derfyn maint cymhwysiad o amgylch y ddolen hon. Mae gwall I/O yn lawrlwythiad wedi methu, nid cwblhau llwyddiannus gyda llai o feitiau.

Cymharwch hydau ar yr un haen. Gall codio chunked HTTP/1.1 ddisodli Content-Length ac mae'n cael ei ddatgodio gan y gweithrediad HTTP. Gall procsi ei ail-fframio. Gall dadgywasgu hefyd wneud cyfrif beitiau datgodiedig y cymhwysiad yn wahanol i Content-Length wedi'i godio.

Os yw Transfer-Encoding a Content-Length ill dau yn ymddangos, peidiwch â dewis rhif cyfleus: mae fframio HTTP yn rhoi blaenoriaeth i godio trosglwyddo ac yn trin y cyfuniad fel gwall posibl. Gadewch y dosrannu hwnnw i weithrediad cydymffurfiol.

Mae angen gwirio ymddygiad concrit URLConnection ar gyfer URL FTP drwy borth HTTP; nid yw'n gwarantu bod pob cyrchydd pennawd HTTP yn ymddwyn fel ar URL HTTP cyffredin ym mhob JDK. Defnyddiwch yr API hyd â gwerth hir lle mae metadata yn bwysig, a dilysu'r artifact gorffenedig yn erbyn yr hyd neu'r swm gwirio sydd ei angen mewn gwirionedd. Nid yw darllen y corff yn gwneud pennawd a oedd yn absennol o'r blaen yn ymddangos.

Erthyglau cysylltiedig