2014-10-07 7 views
8

मैं निम्न उदाहरण कोड है कहते हैं:scanner.close() क्या करता है?

Scanner scan1 = new Scanner(System.in); // declaring new Scanner called scan1 
int x = scan1.nextInt(); // scan for user input and set it to x 
System.out.println(x); // print the value of x 
scan1.close(); // closes the scanner (I don't know exactly what this does) 
Scanner scan2 = new Scanner(System.in); // declaring new Scanner called scan1 
int y = scan2.nextInt(); // scan for user input and set it to y 
System.out.println(y); // print the value of y 

मैं Oracle documentation on the Scanner class पढ़ सकते हैं और इस में आए:

जब एक स्कैनर बंद कर दिया है, यह अपने इनपुट स्रोत को बंद करता है, तो स्रोत closeable लागू करता होगा इंटरफेस।

यह है कि एक बार एक Scanner (System.in का) बंद कर दिया है इसका मतलब यह है, मैं अब पूरे जावा प्रोग्राम के दौरान System.in उपयोग करने में सक्षम हो जाएगा? या इसका मतलब यह है कि मैं अब कक्षा में इसका उपयोग नहीं कर पाऊंगा? या केवल विधि? या केवल इसका दायरा?

मेरे पास एक और सवाल है, क्या स्कैनर उस दायरे तक सीमित है जो इसे घोषित किया गया था (आदिम डेटा प्रकारों के समान)?

+1

संभावित डुप्लिकेट [सिस्टम.in से जुड़े स्कैनर को बंद करें] (http://stackoverflow.com/questions/14142853/close-a-scanner-linked-to-system-in) – MarsAtomic

+0

इसके अलावा http: // stackoverflow .com/प्रश्न/23621668/जावा-क्लोजिंग-स्कैनर-एंड-रिसोर्स-लीक – NPE

+0

यह भी संबंधित है: http://stackoverflow.com/questions/14962082/close-scanner-without-closing-system-in – NPE

उत्तर

5

हां, इसका मतलब है कि System.in बंद हो जाएगा। टेस्ट मामला:

import java.util.*; 

public class CloseScanner { 
    public static void main(String[] args) throws Exception { 
     Scanner scanner = new Scanner(System.in); 
     scanner.close(); 
     System.in.read(); 
    } 
} 

इस कोड को एक बार बंद

$ java CloseScanner 
Exception in thread "main" java.io.IOException: Stream closed 
    at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:162) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:206) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:254) 
    at CloseScanner.main(CloseScanner.java:7) 

साथ समाप्त हो जाता है, तो आप अपने कार्यक्रम के आराम के लिए System.in उपयोग करने में सक्षम नहीं होगा।

scanner = new Scanner(foo.somethingThatMakesAnInputStream()); 

आप ऐसा कर सकते हैं और कॉल: तथ्य यह है कि close() के माध्यम से पारित हो जाता है अच्छा है क्योंकि यह मतलब है कि आप इनपुट स्ट्रीम के लिए एक अलग संदर्भ बनाए रखने के लिए इतना है कि आप इसे बाद में बंद कर सकते हैं, उदाहरण के लिए नहीं है अंतर्निहित धारा को बंद करने के लिए स्कैनर पर .close()

ज्यादातर मामलों में आप System.in को बंद नहीं करना चाहते हैं, इसलिए आप उस स्थिति में .close() पर कॉल नहीं करना चाहेंगे।

+2

+1 सिर्फ एक टेस्ट केस के साथ कोशिश कर रहा है, जिससे अटकलों और थियोरिंग के जाल से बाहर निकल रहा है। – Stewart

+0

स्कैनर का स्रोत # बंद करें http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/Scanner.java#Scanner.close%28%29 –

+0

मैं देखता हूं, इसलिए स्पष्ट करने के लिए, अगर मैं किसी भी विधि (जिसे कहा जाता है) में लूप में 'System.in' पर 'scanner.close()' का उपयोग करता हूं, तो मैं इसे किसी भी रूप में उपयोग नहीं कर पाऊंगा मेरे कार्यक्रम में कक्षाएं? – Kootling

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