2012-08-16 13 views
5

नीचे दिए गए कोड का टुकड़ा कुछ यूआरएल से एक फाइल डाउनलोड करता है और इसे स्थानीय फाइल में सहेजता है। केक का टुकड़ा। यहां क्या गलत हो सकता है?मेरी डेटा स्ट्रीम के साथ छेड़छाड़ कौन कर रहा है?

protected long download(ProgressMonitor montitor) throws Exception{ 
    long size = 0; 
    DataInputStream dis = new DataInputStream(is); 
    int read = 0; 
    byte[] chunk = new byte[chunkSize]; 
    while((read = dis.read(chunk)) != -1){ 
     os.write(chunk, 0, read); 
     size += read; 
     if(montitor != null) 
      montitor.worked(read); 
    } 

    chunk = null; 
    dis.close(); 
    os.flush(); 
    os.close(); 
    return size; 
} 

कारण मैं यहाँ एक प्रश्न पोस्ट कर रहा हूँ, क्योंकि यह समय की 99.999% में काम करता है और जैसा कि उम्मीद की जब भी एक एंटीवायरस या कुछ अन्य सुरक्षा के लिए इस कोड चलाने वाले कंप्यूटर पर स्थापित सॉफ्टवेयर है काम नहीं करता है। मैं अंधेरे से इस तरह से एक उंगली को इंगित कर रहा हूं क्योंकि जब भी मैं इसे रोकता हूं (या अक्षम), कोड फिर से सही काम करता है। इस तरह के हस्तक्षेप का अंतिम परिणाम यह है कि डाउनलोड की गई फ़ाइल का एमडी 5 उम्मीद से मेल नहीं खाता है, और एक पूरी नई गाथा शुरू होती है।

तो, सवाल यह है - क्या यह वास्तव में संभव है कि कुछ स्मार्ट "सुरक्षा" सॉफ़्टवेयर यूआरएल से आने वाली वास्तविक स्ट्रीम को इसके बारे में जानने के बिना बदल देगा? और यदि हां - आप इससे कैसे निपटते हैं? (Kasperksy और Norton उत्पादों के साथ सत्यापित)।


संपादित-1: जाहिर है मैं इस समस्या पर एक पकड़ लिया है और यह antiviruses के साथ कुछ नहीं मिला है। यह डाउनलोड एफ़टीपी सर्वर (विशेष रूप से फाइलज़िला) से होता है और हम क्लाइंट साइड पर अपाचे कॉमन्स एफटीपी का उपयोग करते हैं। मैंने जो किया वह एफ़टीपी सर्वर पर गया और डाउनलोड के बीच में कनेक्शन को समाप्त कर दिया गया। मुझे उम्मीद है कि है .read (..) क्लाइंट पक्ष पर IOException फेंक देगा, लेकिन यह कभी नहीं हुआ। इसके बजाए, is.read (..) रिटर्न -1 का अर्थ है कि स्ट्रीम से कोई और डेटा नहीं आ रहा है। यह निश्चित रूप से अप्रत्याशित है और बताता है कि कभी-कभी मुझे आंशिक फाइल क्यों मिलती हैं। यह व्याख्या नहीं करता है हालांकि कभी-कभी डेटा भी बदल जाता है।

+1

'बारफ' परिभाषित करें। – EJP

+1

आप निष्पादन कैसे संभालते हैं? यदि 'dis.close()' अपवाद फेंकता है तो आउटपुट स्ट्रीम उदाहरण के लिए ठीक से बंद नहीं होगा। – dacwe

+0

@dacwe - जो भी इस विधि से फेंक दिया गया है वह विफलता है, सब कुछ निरस्त हो जाता है। रहस्य यह है कि कुछ भी नहीं फेंक दिया जाता है, सब कुछ ठीक हो जाता है। समस्या यह है कि यह मेरे द्वारा अपेक्षित डेटा नहीं है, ज्यादातर बार इसे आधे में काटा जाता है, कभी-कभी बदल दिया जाता है .. – Dima

उत्तर

1

हाँ यह हर समय मेरे साथ होता है। मेरे मामले में यह मेरे कॉर्पोरेट नेटवर्क पर वेबसाइटों द्वारा पारदर्शी HTTP प्रॉक्सीइंग के कारण होता है। सबसे खराब समस्या ब्लॉक पेज के कारण 200 ओके के साथ वापस आ रही है।

क्या आपको हर बार समान या समान भ्रष्टाचार मिलता है? उदाहरण के लिए, क्या आपको कुछ HTML बताते हैं कि अनुरोध क्यों अवरुद्ध किया गया था? सबसे अच्छा आप संभवतः ब्लॉक पेज में कुछ टेक्स्ट में डाउनलोड किए गए डेटा के पहले कुछ बाइट्स की तुलना कर सकते हैं और इस मामले में अपवाद फेंक सकते हैं।

संपादित करें: आपके अपडेट के आधार पर, क्या आपने एफ़टीपी क्लाइंट को छवि/बाइनरी मोड पर सेट किया है?

+0

मेरे मामले में यह एक पाठ नहीं है, मैंने देखा होगा कि वास्तव में क्या छेड़छाड़ की जाती है। मैं द्विआधारी स्थापना पैकेज डाउनलोड करता हूं, इसलिए यह कहना मुश्किल है कि इसका किस भाग को विस्फोटित किया गया है। अंतिम परिणाम एक भ्रष्ट बाइनरी और अंतिम उपयोगकर्ताओं का कुल भ्रम है जो मुझ पर एक उंगली इंगित करता है जब वास्तव में ऐसा कुछ होता है जो उनके नेटवर्क पर बैठता है। – Dima

+0

आपको डिस्क पर गलत बाइट्स लिखने की आवश्यकता है और उन्हें देखें। – artbristol

+0

शायद यह एक अच्छा विचार है .. – Dima

संबंधित मुद्दे