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 හැසිරීම පරීක්ෂා කිරීම අවශ්‍ය වේ; එය සෑම JDK එකකම සෑම HTTP ශීර්ෂ ප්‍රවේශයක්ම සාමාන්‍ය HTTP URL එකක් මෙන් හැසිරෙන බවට සහතික නොවේ. මෙටාදත්ත වැදගත් තැන දිගු අගයක් සහිත length API භාවිතා කර, සම්පූර්ණ වූ ප්‍රතිඵලය සැබවින්ම අවශ්‍ය දිග හෝ චෙක්සම් සමඟ තහවුරු කරන්න. ශරීරය කියවීමෙන් පෙර නොතිබූ ශීර්ෂයක් දිස්වන්නේ නැත.

අදාළ ලිපි