2012-01-26 15 views
13

अस्वीकरण: मैंने उन सभी प्रश्नों को देखा है जिन्हें मैं पा सकता हूं और उनमें से कोई भी इस सटीक प्रश्न का उत्तर नहीं देता है। यदि आपको कोई मिलता है तो कृपया मुझे इंगित करें और विनम्र रहें।स्कैनर के साथ फ़ाइल या फ़ाइल रीडर का उपयोग करें?

new Scanner(BufferedReader(FileReader("xanadu.txt"))); 

लेकिन Javadoc इस तरह स्कैनर के साथ एक पाठ फ़ाइल को खोलता है:

तो, Oracle I/O tutorial इस प्रकार स्कैनर के साथ एक पाठ फ़ाइल को खोलता है

new Scanner(new File("myNumbers")); 

यह उपयोग करने के लिए अच्छा होगा सरल तरीका, विशेष रूप से जब मेरे पास एक छोटी फ़ाइल होती है और छोटे बफर के साथ रह सकती है, लेकिन मैंने लोगों को यह भी देखा है कि जब आप सीधे फ़ाइल खोलते हैं तो can't close it। यदि ऐसा है, तो आधिकारिक दस्तावेज़ीकरण में वह मुहावरे क्यों उपयोग किया जाता है?

संपादित करें: मैंने new Scanner(FileReader("blah.txt")); भी देखा है लेकिन यह दोनों दुनिया के सबसे खराब की तरह लगता है।

संपादित करें: मैं स्कैनर का उपयोग करने के बारे में बहस शुरू करने की कोशिश नहीं कर रहा हूं या नहीं। मेरे पास स्कैनर का उपयोग करने के बारे में एक सवाल है। धन्यवाद।

उत्तर

5

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

+1

जैसा कि @ ट्यूडर ने इंगित किया है, फ़ाइल बंद नहीं है() - क्या आप इस तरह स्कैनर का उपयोग करते समय वास्तविक फ़ाइल बंद करते हैं, या संसाधन लटका हुआ है? – orbfish

+3

हां, यदि आप स्कैनर कन्स्ट्रक्टर में फ़ाइल पास करते हैं तो इसका उपयोग स्ट्रीम खोलने के लिए किया जाता है जो Scanner.close() विधि को कॉल करने पर बंद हो जाएगा। कोई फर्क नहीं पड़ता कि आप किस कंस्ट्रक्टर का उपयोग करते हैं यदि आप करीबी() को ठीक से कॉल करते हैं (उदाहरण के लिए प्रयास करें/अंत में) तो यह ठीक से बंद हो जाएगा। – maximdim

-2

स्कैनर ऑब्जेक्ट बनाने के कई तरीके हैं।

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

मैं व्यक्तिगत रूप से भले ही फ़ाइल पढ़ने के लिए स्कैनर का उपयोग नहीं होता। BufferedReader ट्यूटोरियल देखें। यह पता लगाने में बहुत मुश्किल नहीं है।

+0

यह मेरे प्रश्न का उत्तर नहीं देता है। यदि आप इसका उत्तर देने जा रहे हैं तो कृपया प्रश्न पढ़ें। नोट: स्कैनर या सीधे BufferedReader का उपयोग करने के लिए वहां बहुत बहस है। दोनों जावा द्वारा प्रदान किए जाते हैं, मैं इसका उपयोग करने का सर्वोत्तम अभ्यास करने की कोशिश कर रहा हूं, यह तय नहीं कर रहा हूं कि इसका उपयोग करना है या नहीं। – orbfish

+0

http://docs.oracle.com/javase/tutorial/essential/io/scanning.html – bdabmxican

+0

हां, मैंने इसे पढ़ लिया है, मेरे प्रश्न का उत्तर नहीं दिया, जिसे आप जान लेंगे कि क्या आप मेरा प्रश्न पढ़ते हैं! – orbfish

2

File कक्षा में close() विधि नहीं है क्योंकि यह केवल डिस्क फ़ाइल को सारणीबद्ध करता है। यह फ़ाइल में इनपुट स्ट्रीम नहीं है, इसलिए बंद करने के लिए कुछ भी नहीं है।

+0

हां, मुझे पता है कि फाइल बंद करने योग्य नहीं है। तो, क्या आप एक संसाधन लटकते हैं (जैसा कि प्रश्न में दिए गए लिंक द्वारा सुझाया गया है) या नहीं? – orbfish

+2

आप कुछ भी लटकते नहीं छोड़ते हैं। फ़ाइल क्लास एक भौतिक फ़ाइल के लिए सिर्फ एक सूचना धारक है। यह एक फाइल हैंडल नहीं है। – Tudor

1

हाँ आप ऐसा कर सकते हैं।

मूल रूप से आप करते हैं:

Scanner file = new Scanner(new FileReader("file.txt")); 

एक स्ट्रिंग पढ़ने के लिए:

String s = file.next(); 

आप फ़ाइल के साथ किया जाता है, पाठ्यक्रमों के लिए

file.close(); 
1

घोड़े से करते हैं। स्कैनर javadocs से, एक स्कैनर "ए सरल टेक्स्ट स्कैनर है जो नियमित अभिव्यक्ति का उपयोग करके आदिम प्रकारों और तारों को पार्स कर सकता है।" इसलिए, मेरा प्रश्न यह है कि इससे कोई फर्क नहीं पड़ता कि आप किस दृष्टिकोण का उपयोग करते हैं, फ़ाइल के साथ सरल विकल्प ओरेकल ट्यूटोरियल में पाया गया उतना ही अच्छा है। स्कैनर पाठ फ़ाइलों के सुविधाजनक टोकनिंग के लिए है, और यदि आपकी फ़ाइल छोटी है, जैसा आपने कहा, यह एकदम सही फिट है।

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

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