2012-11-15 17 views
11

तो मुझे अपने प्रोग्राम में एक टेक्स्ट फ़ाइल पढ़ने में कोई समस्या है। यहां कोड है:BufferedReader.readLine() का उपयोग थोड़ी देर में ठीक से

 try{ 
     InputStream fis=new FileInputStream(targetsFile); 
     BufferedReader br=new BufferedReader(new InputStreamReader(fis)); 

     //while(br.readLine()!=null){ 
     for(int i=0;i<100;i++){ 
      String[] words=br.readLine().split(" "); 
      int targetX=Integer.parseInt(words[0]); 
      int targetY=Integer.parseInt(words[1]); 
      int targetW=Integer.parseInt(words[2]); 
      int targetH=Integer.parseInt(words[3]); 
      int targetHits=Integer.parseInt(words[4]); 
      Target a=new Target(targetX, targetY, targetW, targetH, targetHits); 
      targets.add(a); 
     } 
     br.close(); 
    } 
    catch(Exception e){ 
     System.err.println("Error: Target File Cannot Be Read"); 
    } 

जिस फ़ाइल से मैं पढ़ रहा हूं वह तर्कों की 100 पंक्तियां है। अगर मैं लूप का उपयोग करता हूं तो यह पूरी तरह से काम करता है। अगर मैं थोड़ी देर के कथन का उपयोग करता हूं (जिसने लूप के ऊपर टिप्पणी की है) तो यह 50 पर बंद हो जाता है। एक संभावना है कि कोई उपयोगकर्ता प्रोग्राम के साथ प्रोग्राम चला सकता है जिसमें कई लाइनें हैं, इसलिए लूप कार्यान्वयन के लिए मेरा वर्तमान ' टी काम नहीं

लाइन while(br.readLine()!=null) 50 पर क्यों रुकती है? मैंने टेक्स्ट फ़ाइल की जांच की है और ऐसा कुछ भी नहीं है जो इसे लटकाएगा।

जब मैं थोड़ी देर लूप का उपयोग करता हूं तो मुझे कोशिश-पकड़ से कोई त्रुटि नहीं मिलती है, इसलिए मैं स्टंप हो गया हूं। क्या किसी के भी पास कोई सुझाव है?

उत्तर

24

आप लूप के अंदर दूसरी बार br.readLine() पर कॉल कर रहे हैं।
इसलिए, जब भी आप चारों ओर जाते हैं तो आप दो लाइनें पढ़ते हैं।

+0

धन्यवाद के साथ अच्छी तरह से दिखती है! मुझे निश्चित रूप से यह ध्यान रखना चाहिए था। क्या आप जानते हैं कि कोई कामकाज क्या होगा? – billg118

+4

'((लाइन = br.readLine())! = शून्य) जावा में वाक्यविन्यास की अनुमति है, है ना? – jpm

+2

@jpm: हाँ; यह करने का सबसे अच्छा तरीका है। (हालांकि मैं इसे स्पष्ट करने के लिए पहले 'शून्य' रखना चाहता हूं) – SLaks

3

आपकी मदद के लिए स्लैक्स और जेपीएम के लिए धन्यवाद। यह एक बहुत ही साधारण त्रुटि थी जिसे मैंने अभी नहीं देखा था।

जैसा कि स्लैक्स ने इंगित किया था, ब्र्रेडलाइन() को प्रत्येक लूप में दो बार बुलाया जा रहा था जिससे कार्यक्रम केवल मूल्यों का आधा हो गया। यहां तय कोड है:

try{ 
     InputStream fis=new FileInputStream(targetsFile); 
     BufferedReader br=new BufferedReader(new InputStreamReader(fis)); 
     String words[]=new String[5]; 
     String line=null; 
     while((line=br.readLine())!=null){ 
      words=line.split(" "); 
      int targetX=Integer.parseInt(words[0]); 
      int targetY=Integer.parseInt(words[1]); 
      int targetW=Integer.parseInt(words[2]); 
      int targetH=Integer.parseInt(words[3]); 
      int targetHits=Integer.parseInt(words[4]); 
      Target a=new Target(targetX, targetY, targetW, targetH, targetHits); 
      targets.add(a); 
     } 
     br.close(); 
    } 
    catch(Exception e){ 
     System.err.println("Error: Target File Cannot Be Read"); 
    } 

धन्यवाद फिर से! तुम लोग महान हो! अगर आप अभी भी इस सवाल पर ठोकर कर रहे हैं

while ((line = bufferedReader.readLine()) != null) { 
      System.out.println(line); 
     } 
+0

तारों की अपरिवर्तनीयता का महान शोषण भी दर्शाता है। – JoshuaTree

25

भी बहुत व्यापक ...

try{ 
    InputStream fis=new FileInputStream(targetsFile); 
    BufferedReader br=new BufferedReader(new InputStreamReader(fis)); 

    for (String line = br.readLine(); line != null; line = br.readLine()) { 
     System.out.println(line); 
    } 

    br.close(); 
} 
catch(Exception e){ 
    System.err.println("Error: Target File Cannot Be Read"); 
} 
+0

यह मेरे लिए जाने का तरीका है। 'जबकि ((लाइन = br.readLine())! = शून्य) 'बस बहुत बदसूरत है। मुझे 'br.readLine() 'दो बार कॉल करना पसंद नहीं है लेकिन इसके बारे में आप इतना कुछ नहीं कर सकते हैं। मैं सिर्फ 'के लिए 'कथन को छोटा कर दूंगा (स्ट्रिंग एस = br.readLine(); एस! = Null; s = br.readLine())' – Adam

+1

मुझे लूप सिंटैक्स पसंद है, इसलिए आपके पास कोई नहीं है लूप के बाद चारों ओर लटकते चर। इसके अलावा इसे थोड़ा छोटा कर दिया जा सकता है, फिर भी बदसूरत: 'के लिए (स्ट्रिंग लाइन = शून्य; शून्य! = (लाइन = रीडर.readLine());) ' ** नोट: **' reader.readLine() का उपयोग कर 'सशर्त और' के लिए 'प्रारंभकर्ता में पहली पंक्ति को छोड़ने का कारण बनता है। – Raystorm

5

आप निम्नलिखित की तरह एक संरचना का उपयोग कर सकते हैं। आजकल चीजें जावा 8:

try { 
    Files.lines(Paths.get(targetsFile)).forEach(
    s -> { 
     System.out.println(s); 
     // do more stuff with s 
    } 
); 
} catch (IOException exc) { 
    exc.printStackTrace(); 
} 
संबंधित मुद्दे