2012-02-24 8 views
5

का उपयोग करके बड़ी फ़ाइलों को लिखना मैं BufferedInputStream & BufferedOutputStream का उपयोग करके बड़ी फ़ाइलों (100 एमबी से बड़ा) पढ़ने और लिखने की कोशिश कर रहा हूं। मुझे हीप मेमोरी इश्यू & ओओएम अपवाद मिल रहा है।
कोड लगता है:BufferedOutputStream

BufferedInputStream buffIn = new BufferedInputStream(iStream); 
/** iStream is the InputStream object **/ 

BufferedOutputStream buffOut=new BufferedOutputStream(new FileOutputStream(file)); 
byte []arr = new byte [1024 * 1024]; 
int available = -1; 
while((available = buffIn.read(arr)) > 0) { 
    buffOut.write(arr, 0, available); 
}  
buffOut.flush(); 
buffOut.close();   

मेरा प्रश्न है जब हम का उपयोग BufferedOutputStreeam यह स्मृति पकड़े तक पूर्ण फ़ाइल बाहर लिखा है है?
BufferedOutputStream का उपयोग कर बड़ी फ़ाइलों को लिखने का सबसे अच्छा तरीका क्या है?

+0

लूप –

+0

के अंदर फ्लश करने का प्रयास करें जब तक आप इसे फ्लश नहीं करते हैं तब तक यह बफरिंग हो जाता है। जबकि लूप में इसे फ्लश करें। –

+2

@jcomeau_ictx - नहीं, BufferedOutputStream तब तक बफर नहीं करता जब तक आप इसे फ्लश नहीं करते हैं, इसमें एक निश्चित आंतरिक बफर आकार होता है। पीने के दौरान – jtahlborn

उत्तर

5

आपके द्वारा प्रदान किए गए कोड के साथ कुछ भी गलत नहीं है। आपकी याददाश्त के मुद्दों को कहीं और झूठ बोलना चाहिए। buffered धाराओं में एक निश्चित स्मृति उपयोग सीमा है।

निर्धारित करने के लिए क्या एक OOME कारण बना हुआ है, ज़ाहिर है, OOME एक ढेर डंप पैदा करते हैं और फिर एक स्मृति प्रोफाइलर में है कि हीप डंप की जांच करने के लिए सबसे आसान तरीका है।

+0

यह सही है। लेकिन, कोड के साथ कोई समस्या है, buffOut.write() कम बाइट्स लिख सकता है जो आप इसे लिखने के लिए कहते हैं, इस मामले में, आपको तब तक लिखना जारी रखना होगा जब तक आप सभी उपलब्ध बाइट्स नहीं लिख लेते। – Bill

+1

@ बिल - नहीं, यह सच नहीं है। 'लिखो()' हमेशा सभी बाइट्स लिखता है (इसमें कोई वापसी मूल्य नहीं है)। – jtahlborn

+0

क्या आप इस कोड को कई धागे में एक साथ चला रहे हैं? यह देखना मुश्किल है कि यह आपकी स्मृति त्रुटि से बाहर का स्रोत है। –