2011-04-15 8 views
5

मैं जावा में एक नौसिखिया हूं और मैं एक फाइल पर मैक गणना करने की कोशिश कर रहा हूं। अब फ़ाइल के आकार को रनटाइम पर नहीं जाना जाता है, इसलिए मैं बस फाइल में सभी फाइलों को लोड नहीं कर सकता। इसलिए मैंने कोड लिखा ताकि यह बिट्स (इस मामले में 4k) में पढ़े। मेरा मुद्दा यह है कि मैंने पूरी फ़ाइल को स्मृति में लोड करने का प्रयास किया ताकि यह देखने के लिए कि दोनों विधियां एक ही हैश उत्पन्न करती हैं या नहीं। हालांकि वे अलग अलग हैशमेमोरी में जावा रीडिंग फाइल और मेमोरी को कैसे उड़ाया जाए

यहाँ बिट कोड द्वारा सा उत्पादन हो रहे हैं:

FileInputStream fis = new FileInputStream("sbs.dat"); 
byte[] file = new byte[4096]; 
m = Mac.getInstance("HmacSHA1"); 
int i=fis.read(file); 
m.init(key); 
while (i != -1) 
{ 
    m.update(file); 
    i=fis.read(file); 
} 
mac = m.doFinal(); 

और यहाँ एक बार दृष्टिकोण बिल्कुल है: एक ही हैश

File f = new File("sbs.dat"); 
long size = f.length(); 
byte[] file = new byte[(int) size]; 
fis.read(file); 
m = Mac.getInstance("HmacSHA1"); 
m.init(key); 
m.update(file); 
mac = m.doFinal(); 

वे दोनों का उत्पादन नहीं करना चाहिए ?

प्रश्न हालांकि अधिक सामान्य है। क्या पहला कोड फाइल को मेमोरी में टुकड़ों में लोड करने का सही तरीका है और जो कुछ भी हम चक्र के दौरान करना चाहते हैं? (सॉकेट भेजें, एक फाइल सिफर, इत्यादि ...)। यह प्रश्न उपयोगी है क्योंकि मैंने देखा है कि हर ट्यूटोरियल सिर्फ एक ही समय में सब कुछ लोड करता है ...

अपडेट: कार्य :- डी। क्या यह दृष्टिकोण एक सॉकेट के माध्यम से टुकड़ों में फ़ाइल को सही तरीके से भेज देगा?

उत्तर

4

read फ़ंक्शन आपके पूरे सरणी को जरूरी नहीं करेगा। इसलिए, आपको यह जांचना होगा कि read फ़ंक्शन से कितने बाइट लौट रहे थे, और केवल अपने बफर के कई बाइट्स का उपयोग करें।

5

नहीं। आपको कोई गारंटी नहीं है कि fis.read(file) में file.length बाइट्स पढ़े जाएंगे। यही कारण है कि read() आपको यह बताने के लिए एक int वापस कर रहा है कि वास्तव में कितने बाइट्स ने इसे पढ़ा है।

इसके बजाय आप इस करना चाहिए:

m.init(key); 
int i=fis.read(file); 

while (i != -1) 
{ 
    m.update(file, 0, i); 
    i=fis.read(file); 
} 

Mac.update(byte[] data, int offset, int len) विधि है कि आप सरणी बाइट में में वास्तविक डेटा की लंबाई निर्दिष्ट करने के लिए [] की अनुमति देता है का लाभ लेने के।

+0

रवींद्र। मैं बेवकूफ की तरह महसूस करता हूं, मैं पूरी तरह से भूल गया कि मैक कक्षाओं में 3 अपडेट विधियां हैं। फिर भी, मैं अभी भी कुछ आसान के आसपास घंटों खो देता। इसे आज़माएं, लेकिन यह सही लगता है। – ptguy

1

बस जेसन लेब्रुन कहते हैं - पढ़ने की विधि हमेशा बाइट्स की निर्दिष्ट मात्रा को नहीं पढ़ेगी। उदाहरण के लिए: यदि फ़ाइल में 4096 बाइट्स का एकाधिक भाग नहीं है तो आपको क्या लगता है?

मैं कुछ इस तरह के लिए जाना होगा:

 FileInputStream fis = new FileInputStream(filename); 
     byte[] buffer = new byte[buffersize]; 
     Mac m = Mac.getInstance("HmacSHA1"); 
     m.init(key); 

     int n; 
     while ((n = fis.read(buffer)) != -1) 
     { 
      m.update(buffer, 0, n); 
     } 
     byte[] mac = m.doFinal(); 
संबंधित मुद्दे