2012-12-14 13 views
7

तो, फाइलों से सामग्री पढ़ने के लिए स्कैनर क्लास का उपयोग करते समय मैं बस एक दिलचस्प समस्या में भाग गया। असल में, मैं कुछ सटीकता मीट्रिक की गणना करने के लिए निर्देशिका से एक पार्सिंग एप्लिकेशन द्वारा उत्पादित कई आउटपुट फ़ाइलों को पढ़ने की कोशिश कर रहा हूं।जावा स्कैनर फ़ाइलों को पढ़ने के साथ अजीब व्यवहार

असल में, मेरा कोड निर्देशिका में प्रत्येक फाइल के माध्यम से चलता है, और सामग्री को संसाधित करने के लिए उन्हें स्कैनर के साथ खुलता है। किसी भी कारण से, कुछ फाइलें (सभी यूटीएफ -8 एन्कोडेड) स्कैनर द्वारा नहीं पढ़ी जा रही थीं। भले ही फ़ाइलें खाली नहीं थीं, स्कैनर.hasNextLine() अपनी पहली कॉल पर झूठी वापसी करेगा (मैंने डीबगर खोला और इसे देखा)। मैं प्रत्येक बार फाइल ऑब्जेक्ट्स के साथ सीधे स्कैनर शुरू कर रहा था (फ़ाइल ऑब्जेक्ट्स सफलतापूर्वक बनाए गए थे)। अर्थात्:

File file = new File(pathName); 
    ... 
    Scanner scanner = new Scanner(file); 

मैं चीजों की एक जोड़ी की कोशिश की, और अंत में निम्नलिखित तरीके से स्कैनर आरंभ से इस समस्या को दूर करने में सक्षम था:

Scanner scanner = new Scanner(new FileInputStream(file)); 

हालांकि मैं समस्या हल की है, खुश हूँ , मैं अभी भी उत्सुक हूं कि समस्या का कारण बनने के लिए क्या हो रहा है। कोई विचार? बहुत बहुत धन्यवाद!

+0

मैं कुछ सामान एक साथ हैक कर रहा था और आपकी सटीक समस्या में भाग गया। बचाव के लिए FileInputStream! – masher

उत्तर

3

जावा में Scanner.java स्रोत के अनुसार 6u23 एक नई लाइन द्वारा

private static final String LINE_SEPARATOR_PATTERN = 
             "\r\n|[\n\r???]"; 
private static final String LINE_PATTERN = ".*("+LINE_SEPARATOR_PATTERN+")|.+$"; 

का पता चला है तो तुम जांच कर सकता है कि क्या आप फ़ाइलों को पढ़ने के लिए नहीं कर रहे थे में सामग्री के लिए निम्न रेगुलर एक्सप्रेशन से मेल कर सकते हैं।

.*(\r\n|[\n\r???])|.+$ 

इसके अलावा मैं जांचता हूं कि कुछ अपवाद उठाए गए हैं या नहीं।

अद्यतन: इससे मुझे उत्सुकता मिली और मैंने जवाबों की तलाश की। Java Scanner(File) misbehaving, but Scanner(FIleInputStream) always works with the same file

यह अक्षर हैं जो ASCII से बाहर हैं, कि अलग ढंग से व्यवहार कर रहे हैं कि क्या आप फ़ाइल या FileInputStream के साथ अपने स्कैनर प्रारंभ पर निर्भर करता है के बारे में है संक्षेप में प्रस्तुत करना: अपने प्रश्न पूछा गया है और पहले से ही यहाँ हल लगता है।

+0

कोई अपवाद नहीं उठाया गया था, मैंने कोड को पकड़ने की कोशिश में कोड को घेर लिया है। मैंने उन फ़ाइलों को देखा है जो परेशानी पैदा कर रहे हैं- प्रत्येक फ़ाइल को एप्लिकेशन द्वारा उत्पादित किया जाता है और मानक मशीन पठनीय प्रारूप में होता है। फ़ोल्डर में 100 फाइलें हैं, और उनमें से 5 इस समस्या का कारण बन रही हैं। चूंकि फाइलों का उत्पादन करने वाले एप्लिकेशन वास्तव में उन्हें मानक तरीके से बनाते हैं, इसलिए मैं उम्मीद करता हूं कि लाइन विभाजक काम कर रहे हैं। मैं आगे बढ़ जाऊंगा और सुनिश्चित करूँगा कि regexp इन फ़ाइलों में मौजूद है। – shaunvxc

+0

हालांकि, अजीब हिस्सा यह है कि जब मैं फ़ाइल के बजाय फ़ाइल इनपुटपुट के साथ स्कैनर प्रारंभ करता हूं, तो यह सब ठीक काम करता है- यह पूरी तरह से किसी भी समस्या के साथ सामग्री को पढ़ता है। – shaunvxc

+0

बस एक उत्तर मिला, मेरा अपडेट देखें। – Will

0

मैं यह जांचने की कोशिश करता हूं कि फ़ाइल को पढ़ने के बाद आप हमेशा स्कैनर बंद करते हैं या नहीं। क्या आप केवल nNextLine() और nextLine() को कॉल करते हैं, या आप उस स्कैनर पर एक और अगली XXX() विधि कॉल करते हैं?

+0

क्षमा करें मुझे यह शामिल करना चाहिए था कि मेरे प्रश्न में- हाँ, मैं प्रत्येक फ़ाइल के बाद स्कैनर बंद कर रहा था, और मैं केवल कॉलिंग नेक्स्टलाइन() और अगलीलाइन() को कॉल कर रहा था। समस्या उत्पन्न करने वाली विशेष फ़ाइलों के लिए, अगला कॉल NextLine() को झूठी लौटा दी गई है। – shaunvxc

+0

क्या आपने उन "अजीब" फ़ाइलों से पढ़ने के दौरान स्कैनर डीबग करने का प्रयास किया था? – Behnil

+0

हाँ मैंने किया, जब मैंने स्कैनर ऑब्जेक्ट में देखा, तो उसका बफर पूरी तरह से खाली था .. – shaunvxc

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