ការទាញយក Java តាមរយៈប្រូកស៊ី នៅពេល getContentLengthLong ត្រឡប់ -1
ដោះស្រាយ Content-Length ដែលមិនស្គាល់ក្នុងការទាញយក Java តាមប្រូកស៊ី ដោយមិនចាត់ទុកមេតាដាតាទំហំដែលបាត់ជាការឆ្លើយតបទទេ។
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 ដែលត្រូវការពិតប្រាកដ។ ការអានតួមិនធ្វើឲ្យក្បាលដែលធ្លាប់បាត់លេចឡើងវិញទេ។