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 نى ئىشلىتىڭ، ھەمدە تاماملانغان مەھسۇلاتنى ھەقىقەتەن تەلەپ قىلىنغان ئۇزۇنلۇق ياكى checksum بىلەن دەلىللەڭ. گەۋدىنى ئوقۇش ئىلگىرى يوق باشلىقنى كۆرۈنەرلىك قىلمايدۇ.

مۇناسىۋەتلىك ماقالىلەر