2013-07-30 10 views
5

प्रयोग किया जाता है यह कोड है:पहला वर्ण कट जाता है जब BufferedReader

File file = new File("Hello.txt"); 
file.createNewFile(); 
FileWriter write = new FileWriter(file); 
BufferedWriter bufWrite = new BufferedWriter(write); 
bufWrite.write("HelloWorld"); 
bufWrite.flush(); 
bufWrite.close(); 

FileReader read = new FileReader(file); 
BufferedReader bufRead = new BufferedReader(read); 
while(bufRead.read()!=-1){ 
System.out.println(bufRead.readLine()); 
} 
bufRead.close(); 

यहाँ, उत्पादन elloWorld है। 'वहाँ नहीं है। ऐसा क्यों है? यकीन नहीं है कि मैं यहाँ कुछ भी गलत कर रहा हूँ!

उत्तर

8

यह एक आश्चर्य की बात आम सवाल है।

जब आप ऐसा करेंगे

bufRead.read() 

आप वास्तव में एक चरित्र 'पढ़ने के बाद इसे वापस डाल दिया है और आप इसे बाद में दोबारा पढ़ने नहीं देता।

सबसे आसान समाधान यह नहीं करना है।

File file = new File("Hello.txt"); 
try (PrintWriter pw = new PrintWriter(new FileWriter(file))) { 
    pw.println("HelloWorld"); // should have a new line 
} 

try (BufferedReader br = new BufferedReader(new FileReader(file))) { 
    for (String line; (line = br.readLine()) != null;) { 
     System.out.println(line); 
    } 
} 
+3

+1: संसाधनों के साथ प्रयास करें, और 'line' के दायरे को बनाए रखें जहां यह संबंधित है। इस तरह यह किया गया है। –

3

एक बहुत ही सरल कारण है कि: लाइन

while(bufRead.read()!=-1){ 

इनपुट धारा से एक चरित्र खपत करता है। the documentation से:

Reads a single character. This method will block until a character is available, an I/O error occurs, or the end of the stream is reached. 
+0

तो कैसे चरित्र पहले से पढ़ी गई है पाने के लिए। –

1

bufRead.read() पहले चार पढ़ता है।

इसके बजाय bufRead.ready() करें। अपने पाश में

+0

नहीं 'तैयार()' आपको बताता है कि बिना किसी अवरोध के पढ़ने के लिए डेटा है, * जो एक ही बात नहीं है जैसे पढ़ने के लिए डेटा है या नहीं। ओपी को केवल 'readLine()' को कॉल करने की आवश्यकता है। – EJP

9

देखो:

while(bufRead.read()!=-1){ 
System.out.println(bufRead.readLine()); 
} 

आप पाश में read उपयोग कर रहे हैं - जो अगली पंक्ति के प्रथम वर्ण की खपत होगी।

आप उपयोग करना चाहिए:

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

ओह :-) बहुत बहुत धन्यवाद !! – Mercenary

+0

सुझाव है कि आप मेरे उत्तर में 'स्ट्रिंग लाइन' घोषित करने के लिए लूप का उपयोग करें। –

+3

@ पीटर Lawrey: मैं दायरे को कम करने के मामले में आकर्षण देख सकता हूं, लेकिन मैं सामान्य रूप से 'जबकि' लूप पसंद करता हूं मुझे डर लगता है। यह मेरे लिए थोड़ा कम विदेशी लगता है। –

1

आप पहले से ही

while(bufRead.read()!=-1) 

में एक चरित्र को पढ़ने अगर वहाँ एक से अधिक लाइनों तो यह हर पंक्ति के प्रथम वर्ण गायब हो जाएगा रहे हैं!

इसलिए का उपयोग

String line; 
while ((line = bufRead.readLine()) != null) { 
    System.out.println(line); 
} 

देखें read()readLine()

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