2010-10-04 16 views
6

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

return new Scanner(file).useDelimiter("\\Z").next(); 

फ़ाइल ", इनपुट के अंत लेकिन अंतिम टर्मिनेटर के लिए यदि कोई" तक वापस जाने के लिए java.util.regex.Pattern अनुसार प्रलेखन की उम्मीद है। लेकिन क्या होता है यह फ़ाइल से केवल पहले 1024 वर्ण देता है। क्या यह रेगेक्स पैटर्न मैचर द्वारा लगाया गया एक सीमा है? क्या इसे दूर किया जा सकता है? वर्तमान में मैं एक फाइलreader का उपयोग कर आगे जा रहा हूँ। लेकिन मैं इस व्यवहार के कारण को जानना चाहता हूं।

+0

स्कैनर का उपयोग कभी नहीं करें! वास्तव में, आपको बहुत परेशानी होगी। –

+8

@ मार्टिजन कोर्टटेक्स - स्कैनर खराब क्यों है, इस बारे में थोड़ी सी भी संकेत प्रदान करने की देखभाल करता है? – whaley

उत्तर

2

एक FileInputStream

+0

क्या आप यह समझाने के लिए अपना जवाब संपादित कर सकते हैं कि यह क्यों मदद करेगा, और अंतर्निहित मुद्दा क्या है? जैसा कि यह खड़ा है, यह एक टिप्पणी से थोड़ा अधिक है। –

5

स्वयं, मैं इसे पुन: पेश नहीं कर सका। लेकिन मुझे लगता है कि मैं क्या हो रहा है के रूप में प्रकाश डाल सकते हैं।

आंतरिक रूप से, स्कैनर 1024 अक्षरों के वर्ण बफर का उपयोग करता है। यदि संभव हो तो स्कैनर डिफ़ॉल्ट रूप से आपके पठनीय 1024 वर्णों से पढ़ेगा, और फिर पैटर्न लागू करें।

समस्या आपके पैटर्न में है ... यह हमेशा इनपुट के अंत से मेल खाती है, लेकिन इसका मतलब आपके इनपुट स्ट्रीम/डेटा का अंत नहीं है। जब जावा buffered डेटा पर आपका पैटर्न लागू करता है, तो यह इनपुट के अंत की पहली घटना को खोजने का प्रयास करता है। चूंकि 1024 वर्ण बफर में हैं, इसलिए मेलिंग इंजन पहले टोकन के रूप में वापस लौटने से पहले डिलीमीटर के पहले मैच और सबकुछ 1024 को कॉल करता है।

मुझे नहीं लगता कि अंततः इनपुट एंकर स्कैनर में उस कारण के लिए उपयोग के लिए मान्य है। यह सब के बाद, अनंत स्ट्रीम से पढ़ा जा सकता है।

+0

हाय मार्क, मुझे लगता है कि स्कैनर काम नहीं करने का एक सही कारण है। मैं जवाब दे रहा हूँ। इसे काम करने का तरीका एक सही चिह्नित है। आपके उत्तर के लिए धन्यवाद। – Sharmila

1

Scanner में file वस्तु लपेटकर कोशिश एक फ़ाइल से अनेक पुरातन पढ़ने के लिए करना है। यह वास्तव में एक पूरी फाइल को पढ़ने का इरादा नहीं है।

आप तीसरे पक्ष के पुस्तकालयों में शामिल नहीं करना चाहते हैं, तो आप से बेहतर कर रहे हैं एक BufferedReader कि पाठ के लिए एक FileReader/InputStreamReader लपेटता, या बाइनरी डेटा के लिए एक FileInputStream से अधिक पाशन से अधिक पाशन।

आप किसी तृतीय-पक्ष लाइब्रेरी का उपयोग ठीक कर रहे हैं, अपाचे commons-io, एक FileUtils वर्ग है कि स्थिर तरीकों readFileToString और readLines पाठ के लिए और बाइनरी डेटा के लिए readFileToByteArray शामिल ..

0

आप स्कैनर वर्ग का उपयोग कर सकते है जब स्कैनर खोलने सिर्फ एक अक्षरसेट निर्दिष्ट, अर्थात्:

Scanner sc = new Scanner(file, "ISO-8859-1"); 

जावा निर्दिष्ट चारसेट, जो डिफ़ॉल्ट रूप से एक (अंतर्निहित ओएस से) है अगर कुछ भी नहीं दिया जाता है का उपयोग कर अक्षरों में फ़ाइल से पढ़ने बाइट्स धर्मान्तरित (source)। यह अभी भी मुझे स्पष्ट नहीं है कि क्यों स्कैनर डिफ़ॉल्ट के साथ केवल 1024 बाइट्स पढ़ता है, जबकि दूसरे के साथ यह फ़ाइल के अंत तक पहुंच जाता है। वैसे भी, यह ठीक काम करता है!

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