2012-02-05 10 views
10

जावा में, मैंने देखा कि कभी-कभी System.err कथन System.out कथन से पहले पहले मुद्रित हो जाते हैं, हालांकि बाद वाला मेरे कोड में पहले से पहले दिखाई देता है। क्यूं कर? मैं उत्सुक हूँ।सिस्टम.एर स्टेटमेंट कभी-कभी मुद्रित क्यों होते हैं?

+0

1,02 से मैं 'का उपयोग कर System.err' जब मैं वास्तव में इसी कारण के बारे में हैकिंग कर रहा हूँ के साथ फंस गए हैं। पता नहीं जावा के हाल के संस्करण कैसे व्यवहार करते हैं, क्योंकि मैं इसका परीक्षण नहीं करता हूं। –

उत्तर

17

आमतौर पर, System.out एक buffered आउटपुट स्ट्रीम है, इसलिए गंतव्य स्थान पर फ़्लश होने से पहले पाठ जमा हो जाता है। यह उन अनुप्रयोगों में प्रदर्शन में नाटकीय रूप से सुधार कर सकता है जो बड़ी मात्रा में टेक्स्ट प्रिंट करते हैं, क्योंकि यह महंगे सिस्टम कॉल की संख्या को कम करता है। हालांकि, इसका मतलब है कि टेक्स्ट हमेशा प्रदर्शित नहीं होता है, और इसे लिखा जाने के बाद बाद में मुद्रित किया जा सकता है।

System.err, दूसरी ओर, आमतौर पर buffered नहीं है क्योंकि त्रुटि संदेशों को तुरंत मुद्रित करने की आवश्यकता होती है। यह धीमा है, लेकिन अंतर्ज्ञान यह है कि त्रुटि संदेश समय-महत्वपूर्ण हो सकते हैं और इसलिए कार्यक्रम की मंदी को उचित ठहराया जा सकता है। the Javadoc for System.err के अनुसार:

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

(मेरे जोर)

हालांकि, एक परिणाम के रूप में, System.out के लिए भेजा पुराने डेटा को नए System.err संदेशों के बाद दिखाए जाएं, वर्ष बफ़र डेटा बाद में प्लावित है के बाद से से संदेश System.err भेज दिया गया। उदाहरण के लिए घटनाओं के इस क्रम:

  • "हैलो," System.out
  • "पैनिक" करने के लिए बफ़र है System.err के लिए सीधे भेजा जाता है और तुरंत छपा है।
  • "दुनिया!" System.out को बफ़र है, और बफ़र डेटा छपा है

उत्पादन

PANIC 
Hello, world! 

हालांकि HelloPANIC से पहले System.out को छपा था System.err को मुद्रित किया गया था में परिणाम होगा।

आशा है कि इससे मदद मिलती है!

+0

बस जिज्ञासा से बाहर: जावा सी wrt stdout के रूप में ही की गारंटी देता है, जब एक टर्मिनल के लिए पहुंचाया बनाने करता है? अर्थात। जब भी कोई नई लाइन लिखी जाती है तो हम बफर को फ्लश करते हैं? – Voo

+0

@ Voo- मैं सिर्फ जावाडोक को देखा और वहाँ इस तरह के कुछ भी दिखाई नहीं देता। – templatetypedef

+0

'PrintStream' बस सब कुछ के बारे में के बाद फ्लश करने के लिए लागू किया गया है (मुझे लगता है कि आप सीधे' write' कर सकते हैं और यह नहीं है)। –

2

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

Wikipedia से:

यह स्वीकार्य और सामान्य के लिए मानक आउटपुट और मानक त्रुटि है ऐसे पाठ टर्मिनल के रूप में एक ही गंतव्य के लिए निर्देशित किया है,।संदेश उसी क्रम में दिखाई देते हैं क्योंकि प्रोग्राम उन्हें लिखता है, जब तक बफरिंग शामिल न हो। (उदाहरण के लिए, एक सामान्य स्थिति है जब मानक त्रुटि धारा unbuffered है, लेकिन मानक आउटपुट धारा लाइन बफ़र है, इस मामले में, पाठ मानक त्रुटि के लिए लिखा बाद में, टर्मिनल पहले पर प्रकट हो सकता है, तो मानक आउटपुट स्ट्रीम का बफर नहीं है अभी तक भरा है।)

+0

मुझे लगता है कि काम धाराओं के लिए कभी नहीं किसी भी प्राथमिकताओं में से दिल है .. कैसे करेंगे? मैं सरल बफरिंग स्पष्टीकरण के साथ जाऊंगा। – Voo

+0

बस एक फूलदार भाषा की समस्या है। अधिक तकनीकी होने के लिए फिक्स्ड :) –

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

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