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 គឺជាការទាញយកដែលបរាជ័យ មិនមែនការបញ្ចប់ដោយជោគជ័យជាមួយបៃតិចជាងនោះទេ។

ប្រៀបធៀបប្រវែងនៅស្រទាប់ដូចគ្នា។ ការអ៊ិនកូដ chunked របស់ HTTP/1.1 អាចជំនួស Content-Length ហើយត្រូវបានឌិកូដដោយការអនុវត្ត HTTP។ ប្រូកស៊ីអាចដាក់ស៊ុមឡើងវិញ។ ការបន្ទោសបន្ថយក៏អាចធ្វើឲ្យចំនួនបៃដែលឌិកូដរបស់កម្មវិធីខុសពី Content-Length ដែលអ៊ិនកូដ។

ប្រសិនបើទាំង Transfer-Encoding និង Content-Length លេចឡើង កុំជ្រើសលេខដែលងាយស្រួល៖ ការដាក់ស៊ុម HTTP ផ្តល់អាទិភាពដល់ការអ៊ិនកូដផ្ទេរ ហើយចាត់ទុកការរួមបញ្ចូលជាកំហុសដែលអាចកើតឡើង។ ទុកការញែកនោះឲ្យការអនុវត្តដែលអនុលោម។

URL FTP តាមច្រកចេញ HTTP ត្រូវការពិនិត្យឥរិយាបថ URLConnection ជាក់លាក់របស់វា; វាមិនធានាថាការចូលប្រើក្បាល HTTP នីមួយៗមានឥរិយាបថដូច URL HTTP ធម្មតានៅក្នុង JDK នីមួយៗទេ។ ប្រើ length API ដែលមានតម្លៃវែង នៅកន្លែងដែលមេតាដាតាមានសារៈសំខាន់ ហើយ ផ្ទៀងផ្ទាត់អ្វីដែលបានបញ្ចប់ធៀបនឹងប្រវែង ឬ checksum ដែលត្រូវការពិតប្រាកដ។ ការអានតួមិនធ្វើឲ្យក្បាលដែលធ្លាប់បាត់លេចឡើងវិញទេ។

អត្ថបទពាក់ព័ន្ធ