2010-06-12 10 views

उत्तर

10

नहीं, आपको अंतर्निहित फ़ाइल के आकार को समायोजित करने और मेमोरी मैप किए गए बाइट बफर को फिर से बनाने की आवश्यकता होगी।

RandomAccessFile file = new RandomAccessFile(/* some file */); 
MappedByteBuffer buffer = file.getChannel().map(MapMode.READ_WRITE, 0, file.length()); 

// Some stuff happens... 

// adjust the size 
file.setLength(newLength); 

// recreate the memory mapped buffer 
buffer = file.getChannel().map(MapMode.READ_WRITE, 0, file.length()); 

नोट: फ़ाइल की लंबाई निर्धारित करना थोड़ा अजीब व्यवहार है। यदि आप फ़ाइल के अंत से परे किसी विशिष्ट स्थिति पर मानचित्र के माध्यम से फ़ाइल को लिखते हैं (या तो map.position() या map.putX (स्थिति, ...) का उपयोग कर) मानों को अंत में जोड़ा जाएगा फ़ाइल और आप जिस स्थिति की अपेक्षा करते हैं उस पर लिखी नहीं है (कम से कम लिनक्स पर)। यदि यह अवांछित व्यवहार है तो आपको फ़ाइल को वास्तव में बढ़ने के लिए फ़ाइल में डेटा जोड़ना होगा।

+0

क्या आप अन्य शब्दों में अजीब व्यवहार की व्याख्या करेंगे? क्या यह फ़ाइल के अंत में संलग्न होने की उम्मीद नहीं है यदि मैं इसके अंत से लिखता हूं (मैप किए गए बफर के माध्यम से यह पूरे फ़ाइल आकार को मानचित्र करता है)? – geeko

+1

आकार में 50 बाइट्स फ़ाइल के साथ शुरू करें। फ़ाइल के आकार को बढ़ाने के लिए कॉल लम्बाई (1000) पर कॉल करें। फिर फ़ाइल से एक नया नक्शा बनाएं (file.getChannel()। नक्शा (..., 0, 1000)। यदि नए मैप्डबेट बफर पर आप putByte (500, (बाइट) 'x' कहते हैं) मान 'x' होगा फ़ाइल (0-आधारित इंडेक्स) में 50 वें बाइट के रूप में दिखाई दें (शायद अजीब नहीं, लेकिन संभावित रूप से अप्रत्याशित व्यवहार) –

+0

मैं देख सकता हूं कि आपका क्या मतलब है। धन्यवाद माइकल। – geeko

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