2010-01-11 5 views
5

द्वारा फ़ाइल बाइट पढ़ने के लिए java.util.Scanner का उपयोग कर चरित्र द्वारा एक पंक्ति फ़ाइल वर्ण पढ़ने की कोशिश कर रहा हूं। हालांकि मैं इस अपवाद "हो रही है:java.util.Scanner का उपयोग करके बाइट

Exception in thread "main" java.util.InputMismatchException: For input string: "contents of my file" 
    at java.util.Scanner.nextByte(Scanner.java:1861) 
    at java.util.Scanner.nextByte(Scanner.java:1814) 
    at p008.main(p008.java:18) <-- line where I do scanner.nextByte() 

यहाँ मेरी कोड है:

public static void main(String[] args) throws FileNotFoundException { 
    File source = new File("file.txt"); 
    Scanner scanner = new Scanner(source); 
    while(scanner.hasNext()) { 
     System.out.println((char)scanner.nextByte()); 
    } 
    scanner.close() 
} 

किसी को भी मैं गलत क्या कर रहा हो सकता है के रूप में किसी भी विचार है

संपादित करें: मैं मुझे एहसास हुआ हैक्स्टाइट() के बजाय हैनक्स्ट() लिखा है। हालांकि, अगर मैं ऐसा करता हूं तो यह कुछ भी प्रिंट नहीं करता है।

+6

एक स्कैनर चरित्र इनपुट पार्सिंग के लिए है। मुझे संदेह है कि आपको इनपुटस्ट्रीम की आवश्यकता है। –

उत्तर

10

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

लेकिन गंभीरता से: कक्षा InputStream फ़ाइल से बाइट्स को पढ़ता है, बस और विश्वसनीय रूप से, और कुछ भी नहीं करता है।

कक्षा scanner हाल ही में जावा एपीआई में पेश किया गया था, इसलिए पाठ्यपुस्तक उदाहरण आमतौर पर new BufferedReader(new InputStream) के कैस्केड का उपयोग करने के साथ कम दर्द वाले फ़ाइल से डेटा खींच सकते हैं। इसकी विशेषता मुक्त फॉर्म इनपुट फ़ाइलों से संख्याओं और तारों को इनपुट कर रही है। nextByte() विधि वास्तव में इनपुट स्ट्रीम से एक या कुछ दशमलव अंकों को पढ़ती है (यदि वे वहां हैं) और इस प्रकार एक बाइट मान में स्कैन किए गए नंबर को परिवर्तित करती है।

और यदि आप बाइट्स पढ़ रहे हैं, तो आप उन्हें char एस के रूप में क्यों आउटपुट करना चाहते हैं? बाइट वर्ण नहीं हैं, और कुछ जगहों पर ब्रूट-बल इंटरकॉन्टरिंग विफल हो जाएगी। आप उन बाइट्स के मूल्यों को देखने के लिए चाहते हैं, उन्हें प्रिंट के रूप में वे कर रहे हैं और आप छोटे पूर्णांक देखेंगे 0 और 255 के

आप एक फ़ाइल से char रों पढ़ना चाहते हैं के बीच, FileReader आप के लिए वर्ग है ।

+0

मेरे पास "सार" शब्द से शुरू होने वाली एक टेक्स्ट फ़ाइल है (क्या एक आश्चर्य है ..)। वैसे भी जब मैं इसके साथ पढ़ने की कोशिश करता हूं: स्कैनर स्कैनर = नया स्कैनर (फ़ाइल); बाइट बी = scanner.nextByte(); मुझे java.util.InputMismatchException मिल रहा है। मैं 0 और 255 के बीच कोई मूल्य क्यों नहीं देख रहा हूं, क्या आप कृपया मदद कर सकते हैं? फाइल यूटीएफ -8 है। –

+0

मेरा जवाब यह समझाया, लेकिन शायद बहुत अच्छी तरह से नहीं। स्कैनर टेक्स्ट-फॉर्म इनपुट को पढ़ता है और व्याख्या करता है, न कि निम्न-स्तरीय बाइट्स! फ़ाइल बनाने का प्रयास करें, जिसकी पहली पंक्ति '1 10 100 1000 हैलो' पढ़ती है और इसे 'स्कैनर.नेक्स्टबाइट() 'के साथ पढ़ती है। आप नंबर 1, 10 और 100 बाइट्स के रूप में सफलतापूर्वक पढ़ और वापस आ जाएंगे, लेकिन 1000 पर अपवाद भुगतते हैं और (यदि आप इसे पहले पढ़ते हैं) "हैलो" पर क्योंकि वे ऐसे मूल्य नहीं हैं जिन्हें बाइट में प्रदर्शित किया जा सकता है। –

2

स्कैनर पार्सिंग टेक्स्ट डेटा के लिए है - इसकी nextByte() विधि इनपुट को अंकों (संभवतः एक संकेत से पहले) से संबंधित होने की अपेक्षा करती है।

यदि आप वास्तव में टेक्स्ट डेटा पढ़ रहे हैं, या FileInputStream यदि यह बाइनरी डेटा है तो आप शायद FileReader का उपयोग करना चाहते हैं। या FileInputStreamInputStreamReader में लपेटा गया है यदि आप एक विशिष्ट वर्ण एन्कोडिंग के साथ पाठ पढ़ रहे हैं (दुर्भाग्यवश, FileReader आपको एन्कोडिंग निर्दिष्ट करने की अनुमति नहीं देता है लेकिन प्लेटफार्म डिफ़ॉल्ट एन्कोडिंग का उपयोग करता है, जो अक्सर अच्छा नहीं होता है)।

+0

क्षमा करें, आपका क्या मतलब है "पाठ डेटा पार्स करना" और "पाठ डेटा पढ़ना"? –

+0

@ कोरय टुगे: पढ़ने का मतलब है कि जो कुछ भी आता है, एक बाइट (या चरित्र) दूसरे के बाद। पार्सिंग का अर्थ है कि आप डेटा की एक विशिष्ट संरचना या प्रारूप की अपेक्षा करते हैं, जैसे एक वैकल्पिक ऋण चिह्न से पहले अंकों वाले स्ट्रिंग, ताकि आप इसे एक संख्या के रूप में समझ सकें। –

+0

टिप्पणी के लिए धन्यवाद। तो स्कैनर कक्षा में अगलीबाइट विधि केवल "अंक पढ़ने" के लिए है? –

1

जब Scanner निवारण करते समय, underlying I/O errors के लिए जाँच:

if(scanner.ioException() != null) { 
    throw scanner.ioException(); 
} 

हालांकि मैं अन्य लोगों के साथ कर रहा हूँ - यह शायद नहीं इस काम के लिए सही वर्ग है। यदि आप बाइट इनपुट चाहते हैं, तो InputStream (इस मामले में, FileInputStream) का उपयोग करें। यदि आप चार इनपुट चाहते हैं, तो Reader (उदा। InputStreamReader) का उपयोग करें।

1

Scanner सब कुछ सीमित पाठ पढ़ने के बारे में है (the docs देखें)।

nextByte तब तक पढ़ना जारी रखेगा जब तक कि आपके द्वारा निर्दिष्ट डिलीमीटर (डिफ़ॉल्ट रूप से व्हाइटस्पेस) तक पहुंच न जाए और फिर उस स्ट्रिंग को बाइट में परिवर्तित करने का प्रयास करें।

तो अगर आप एक फ़ाइल में 123 456 है, nextByte करने के लिए एक कॉल 123, नहीं 49 (1 चरित्र के लिए दशमलव मान) वापस आ जाएगी।


आप बाइट-दर-बाइट पढ़ना चाहते हैं, तो आप FileInputStream इस्तेमाल कर सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^