2011-05-24 11 views
6


मैं फ़ाइलवाइटर का उपयोग कर रहा हूं और मैंने अजीब व्यवहार देखा है। मैं अपने संग्रह बफ़र अपने आप को और हर एक्स पंक्तियों का उपयोग मैंजावा - क्या फाइलवाइटर एक बफर का उपयोग करता है? (यह मेरे उदाहरण में ऐसा करता है)

IOUtils.writelines(myList,"\n", writer); 

यह फ़ाइल पर लिखने नहीं करता है। मैं इसे और अधिक लाइनों के साथ कॉल करना जारी रखता हूं और केवल पूर्ण होने के बाद ही यह फ़ाइल को लिखता है।
क्या यह एक बफर का उपयोग करता है? मैं इसे अपने दस्तावेज़ीकरण में नहीं ढूंढ सकता।

उत्तर

12

the FileWriter class overview के दूसरे वाक्य का कहना है:

इस वर्ग के निर्माताओं को लगता है कि डिफ़ॉल्ट वर्ण एन्कोडिंग और डिफ़ॉल्ट बाइट-बफर आकार स्वीकार्य हैं। इन मानों को स्वयं निर्दिष्ट करने के लिए, FileOutputStream पर आउटपुटस्ट्रीमवाइटर बनाएं।

(मेरे जोर)

तो स्पष्ट रूप से यह बफ़र है (जब तक कि डिफ़ॉल्ट बाइट-बफर आकार शून्य है और वे वास्तव में उनके शब्दों के साथ अजीब किया जा रहा है कर रहे हैं)

मुझे संदेह है कि यह पर OutputStreamWriter का उपयोग कर रहा है। OutputStreamWriter पर देख रहे हैं:

प्रत्येक लेखन() विधि का प्रत्येक आमंत्रण दिए गए वर्ण (ओं) पर एन्कोडिंग कनवर्टर को लागू करने का कारण बनता है। परिणामस्वरूप बाइट अंतर्निहित आउटपुट स्ट्रीम में लिखे जाने से पहले एक बफर में जमा किए जाते हैं।

(मेरे जोर)

आप यह सुनिश्चित करें कि विभिन्न स्तरों पर विभिन्न बफ़र्स हद तक आप, flush method का उपयोग कर देख सकते हैं करने के लिए प्लावित कर रहे हैं, चाहते हैं।

+0

सविस्तार उत्तर के लिए धन्यवाद: BufferedWriter जावाडोक से। – Jeb

+0

@user: कोई चिंता नहीं, उम्मीद है कि मदद की। –

+0

इसे इंगित करने के लिए धन्यवाद। मैंने इसे दस्तावेज़ों में भी याद किया और वास्तव में उलझन में था जब 'पूंछ' मेरे लेखन नहीं दिखा रहा था! – Hamy

5

मुझे संदेह है कि यह एक कार्यान्वयन विस्तार है, लेकिन मैं अपेक्षा करता हूं कि अधिकांश कार्यान्वयन बफर का उपयोग करें, हां। आपको निश्चित रूप से पर भरोसा नहीं किया जाना चाहिए। जब आप लेखक को फ्लश या बंद करते हैं, तो यह ठीक होना चाहिए।

ध्यान दें कि व्यक्तिगत रूप से मैं FileWriter का उपयोग कर नापसंद के रूप में यह आप वर्ण एन्कोडिंग निर्दिष्ट करने के लिए अनुमति नहीं है - मैं आम तौर पर एक OutputStreamWriter में एक FileOutputStream बजाय लपेटो जाएगा।

0

कक्षा sun.nio.cs.StreamEncoder.CharsetSE.implWrite() पर कक्षा को देखें। यह बाइटबफर का उपयोग करता है।

कक्षा StreamEncoder.CharsetSE आंतरिक रूप से OutputStreamWriter द्वारा उपयोग किया जाता है जिसका आंतरिक रूप से फ़ाइलवाइटर द्वारा उपयोग किया जाता है।

0

लगता है कि यह बफर का उपयोग करता है लेकिन किसी अन्य तरीके से (निम्न-स्तर, बफर डिफ़ॉल्ट रूप से खाली हो सकता है)। BufferedWriter द्वारा इसे लपेटने की आवश्यकता है।

"In general, a Writer sends its output immediately to the underlying 
character or byte stream. Unless prompt output is required, it is advisable 
to wrap a BufferedWriter around any Writer whose write() operations may be 
    costly, such as FileWriters and OutputStreamWriters. For example, 

    <pre> 
    PrintWriter out 
    = new PrintWriter(new BufferedWriter(new FileWriter("foo.out"))); 
    </pre>" 
संबंधित मुद्दे