2010-11-20 18 views
7

मेरे प्रोग्राम में एकाधिक स्कैनर ऑब्जेक्ट्स का उपयोग करने का सही तरीका क्या है। उदाहरण के लिए, मैं फ़ाइल को पढ़ने के लिए स्कैनर का उपयोग करता हूं, फिर फ़ाइल में जो पाया जाता है उसके आधार पर, मैं उपयोगकर्ता इनपुट के लिए संकेत देने के लिए फिर से स्कैनर का उपयोग करता हूं। मेरे कोड का एक निकासSystem.in पर एकाधिक स्कैनर ऑब्जेक्ट्स का उपयोग कैसे करें?

.... 
Scanner f = new Scanner (System.in); //get the file name 
String fileName = f.next(); 
Scanner input = new Scanner(new File(fileName)); 
while (input.hasNext()) 
{ 
    String currentLine = input.nextLine(); 
    if (some pattern found) { 
     Scanner getUserInput = new Scanner (System.in); 
     String userInput = getUserInput.next(); 
     ..... 
    } 
} 
.... 

यह काम नहीं प्रतीत होता है। क्या मुझे userInput.close() का उपयोग करने की आवश्यकता है? मैं क्या गलत कर रहा हूं। ?

जो मुझे समझ में नहीं आता है, पहला System.in बस फ़ाइल का नाम प्राप्त कर रहा है। उसके बाद, यह दूसरे System.in में हस्तक्षेप क्यों करता है। input ऑब्जेक्ट के लिए, फ़ाइल से इसकी पढ़ाई और System.in से नहीं।

उत्तर

11

मैं क्या गलत कर रहा हूं?

उसी स्ट्रीम पर एकाधिक स्कैनर का उपयोग अंतर्निहित समस्या है। स्कैनर स्ट्रीम (और करेंगे) स्ट्रीम का उपभोग कर सकते हैं - यह अप्रत्याशित दुष्प्रभावों का कारण बन सकता है। ऐसा करने के लिए सबसे अच्छा नहीं है।

यदि इनपुट बंद है, तो इनपुट (लेकिन स्ट्रिंग्स के पास close विधि नहीं है) सभी के लिए बंद है - और यह किसी के लिए बहुत मजेदार नहीं है।

संपादित करें: क्यों कई स्कैनर बुरा कर रहे हैं "विवरण": Do not create multiple buffered wrappers on an InputStream

... किसी भी बफ़र आवरण असुरक्षित है; यदि स्कैनर का उपयोग किया जाता है तो यह स्थिति भी शोषक है ...

Java code question ... scanner related? भी देखें जो कुछ दृष्टिकोणों के बारे में भी बात करता है।

+0

टूटी हुई लिंक दिखती है कि यह होना चाहिए -> https://www.securecoding.cert.org/confluence/display/java/FIO06-J.+Do+not+create+multiple+buffered+wrappers+on+ एक + एक + बाइट + या + चरित्र + स्ट्रीम – iX3

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