2011-03-17 20 views
30

मैं जानता हूँ कि जावा में एक समारोह System.setOut विधि का उपयोग कर किसी भी उपयोगकर्ता निर्धारित मान को मानक आउटपुट स्ट्रीम स्थापित करने के लिए है कि वहाँ ..रीसेट किया जा रहा स्टैंडर्ड उत्पादन स्ट्रीम

लेकिन वहाँ एक जो था करने के लिए मानक आउटपुट पुनर्स्थापित करने के लिए कोई भी तरीका है पहले संग्रहीत या एक मानक आउटपुट है?

उत्तर

63

आप FileDescriptor.out के माध्यम से मानक आउट के लिए फ़ाइल डिस्क्रिप्टर को पकड़ सकते हैं। कंसोल के लिए मुद्रित करने के लिए बाहर मानक रीसेट करने के लिए, आप के रूप में निम्नानुसार

System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out))); 

एक और तरीका है, बस मूल वस्तु को पकड़ने की है:

PrintStream stdout = System.out; 
System.setOut(new PrintStream(logFile)); 

// ... 

System.setOut(stdout);     // reset to standard output 
22

यह एक पुरानी सवाल है, लेकिन यह जाता Google खोज में हर समय और मैं इसे सही करना चाहता था। FileDescriptor कक्षा का उपयोग कर आप वास्तव में इसे प्राप्त कर सकते हैं। कॉलिंग new PrintStream(new FileOutputStream(FileDescriptor.out))) आपको कुछ ऐसा देना चाहिए जो stdout को प्रिंट करता है।

import java.io.FileDescriptor; 
import java.io.FileOutputStream; 
import java.io.PrintStream; 


public static void main(String [] args) { 
    System.err.println("error."); 
    System.out.println("out."); 
    System.setOut(System.err); 
    System.out.println("error?"); 
    System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out))); 
    System.out.println("out?"); 
} 
+0

कैसे आ यह अधिक upvoted नहीं है ... – Jas

+1

आप अगर स्वीकार किए जाते हैं उत्तर गलत है स्पष्ट किया जा सका (अर्थात, अगर 'System.setOut (stdout);' की उम्मीद के रूप में काम करता है)? क्या आपकी विधि बनाम बस मूल धारा को संग्रहीत करने का कोई लाभ है? साथ ही, मैं 'System.out' को नोटिस करता हूं और जैसे सभी चिह्नित 'अंतिम' हैं, उत्सुक हैं यदि आप कवर के तहत 'setOut()' को कैसे प्रबंधित करते हैं, इस बारे में कोई अंतर्दृष्टि प्रदान कर सकते हैं। – dimo414

+1

'System.out' और 'System.err' अंतर्निहित मूल सी कोड द्वारा नियंत्रित किए जाते हैं। उन्हें 'अंतिम' के रूप में चिह्नित किया जाता है ताकि उनके सूचक मूल्य VM के मूल भाग के बिना "इसे ध्यान में रखते हुए" नहीं बदला जा सके। प्रदत्त 'सेटऑट()' विधि को मूल भाग को अपने आंतरिक संदर्भों को समायोजित करने की आवश्यकता है। – ksmonkey123

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