2012-02-22 9 views
6

मैंने आज System.out.print() के बारे में एक तर्क सुनाया। एक व्यक्ति ने दावा किया कि print() में \n को समाप्त करने में शामिल नहीं है, तो बफर जो लिखता है वह अंततः भर जाएगा और डेटा खोना शुरू कर देगा। दूसरे व्यक्ति ने दावा किया कि वे अपने सभी जावा कार्यक्रमों के लिए System.out.print() का उपयोग कर रहे थे और इस मुद्दे में कभी नहीं भाग पाए थे।जावा की System.out.print() println() तक हमेशा के लिए बफर होगा?

पहला व्यक्ति सही है? क्या स्टडआउट भरने पर डेटा को अवरुद्ध करने या छोड़ने के लिए System.out.print() के लिए यह संभव है? क्या कोड का एक उदाहरण है जो इसका कारण बन जाएगा?

+2

'System.out' को प्रतिस्थापित करने के लिए 'System.outOut()' का उपयोग करें जो एक कस्टम स्ट्रीम के साथ – paislee

+4

अपवाद फेंक देता है, वे दोनों गलत हैं। '\ n' के पास इसके साथ कुछ लेना देना नहीं है, '.close()' या' .flush() 'को कॉल करने के लिए सब कुछ लिखित या खो जाने वाली स्ट्रीम की सामग्री के साथ करना है। –

उत्तर

11

जब System.out.print द्वारा उपयोग किया गया बफर भर जाता है, तो आउटपुट फ़ाइल (या टर्मिनल या अन्य डेटा लक्ष्य जो प्रोग्राम के मानक आउटपुट स्ट्रीम से जुड़ा होता है) में लिखा जाता है, जिसके परिणामस्वरूप एक खाली बफर होता है। बफर आकार के बारे में देखभाल किए बिना आउटपुट लिखना सामान्य उपयोग है। आप flush पर कॉल न करने से अपने प्रोग्राम को कभी भी क्रैश या ब्लॉक नहीं करेंगे या डेटा खो देंगे।

आपको केवल flush पर कॉल करने की आवश्यकता है यदि आपको तुरंत अपने प्रोग्राम के बाहर डेटा उपलब्ध कराने की आवश्यकता है। उदाहरण के लिए, यदि आपका प्रोग्राम किसी अन्य प्रोग्राम के साथ डेटा का आदान-प्रदान कर रहा है, और आप उस प्रोग्राम के लिए अनुरोध भेज रहे हैं और उस प्रोग्राम के उत्तर की प्रतीक्षा करेंगे, तो आपको यह सुनिश्चित करने के लिए flush पर कॉल करने की आवश्यकता है ताकि अन्य कार्यक्रम प्राप्त हो सके यह। इसी प्रकार, यदि आपका प्रोग्राम (या जिस मशीन पर यह चलता है) क्रैश हो जाता है, तो केवल flush कहलाता है, केवल आउटपुट ही लिखा गया है।

यदि स्ट्रीम स्वचालित रूप से फ्लश करने के लिए सेट है, तो एक न्यूलाइन वर्ण (स्पष्ट रूप से या println के माध्यम से) लिखना flush पर कॉल करने जितना अच्छा है। कॉलिंग close भी flush पर कॉल करता है (यही कारण है कि closeIOException फेंक सकता है: इसे डेटा लिखना पड़ सकता है और ऐसा करने में सक्षम नहीं होना चाहिए, उदाहरण के लिए क्योंकि स्ट्रीम पूरी डिस्क पर फ़ाइल से जुड़ा हुआ है)।

ध्यान दें कि बफर को फ़्लश करने से प्रोग्राम को अवरुद्ध कर दिया जा सकता है, अगर System.out स्ट्रीम को तुरंत प्राप्त करने के लिए तैयार नहीं है (उदाहरण के लिए जब डेटा किसी दूसरे प्रोग्राम पर पाइप किया जाता है जो तुरंत इनपुट नहीं पढ़ता है)। चूंकि बफर को किसी भी समय फ़्लश किया जा सकता है (क्योंकि बफर भरा हुआ होता है), print पर किसी भी कॉल को गैर-खाली तर्क के साथ संभावित रूप से अवरुद्ध कर दिया जाता है।

अधिक जानकारी के लिए, buffered streams tutorial और java.io.PrintStream class के दस्तावेज़ देखें।

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