2013-01-23 41 views
7

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

मेरे वर्तमान कोड:

try { 
    FileInputStream fis = new FileInputStream(myFile); 
    DataInputStream in = new DataInputStream(fis); 
    BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
    String line; 

    while ((line = br.readLine()) != null) { 
     System.out.println(line); 
      if (line.startsWith("word")) { 
       // replace line code here 
      } 
    } 
} catch (Exception ex) { 
    ex.printStackTrace(); 
} 

... जहां myFile एक File वस्तु है।

हमेशा की तरह, किसी भी मदद, उदाहरण या सुझावों की बहुत सराहना की जाती है।

धन्यवाद!

+1

पूरी फ़ाइल को एक बार में क्यों नहीं पढ़ा जाए, इसे बंद करें, इसे लिखने के लिए खोलें और फिर उस पर परिवर्तन करने के बाद प्रत्येक पंक्ति लिखें? – Patashu

+1

@Patashu क्या होगा यदि यह एक बड़ी फाइल थी ?, तो मेरी प्रस्तावित विधि बहुत बेहतर काम करेगी। – iphonedev7

+0

कृपया पाठ पढ़ने के लिए DataInputStream का उपयोग न करें http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

उत्तर

4

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

अगर फ़ाइल मेमोरी में इसे पूरा करने के लिए बहुत बड़ी है तो आप हमेशा लाइन लाइन की सामग्री में लाइन द्वारा पढ़ सकते हैं और उन्हें StringBuilder की बजाय अस्थायी फ़ाइल में लिख सकते हैं। ऐसा करने के बाद आप पुरानी फ़ाइल को हटा सकते हैं और अस्थायी को अपने स्थान पर ले जा सकते हैं।

+0

अच्छा विचार ... मैं कोशिश करूंगा बाहर। – iphonedev7

12

RandomAccessFile एक अच्छा फिट लगता है। इसका जावाडोक कहता है:

इस कक्षा के उदाहरण यादृच्छिक अभिगम फ़ाइल को पढ़ने और लिखने दोनों का समर्थन करते हैं। एक यादृच्छिक अभिगम फ़ाइल फ़ाइल सिस्टम में संग्रहीत बाइट्स की एक बड़ी सरणी की तरह व्यवहार करती है। एक प्रकार का कर्सर है, या आरोपित सरणी में इंडेक्स है, जिसे फ़ाइल पॉइंटर कहा जाता है; इनपुट ऑपरेशंस फ़ाइल पॉइंटर से शुरू बाइट्स पढ़ते हैं और बाइट्स को पढ़ने के बाद फ़ाइल पॉइंटर को अग्रिम करते हैं। यदि यादृच्छिक एक्सेस फ़ाइल को पढ़ने/लिखने के तरीके में बनाया गया है, तो आउटपुट ऑपरेशंस भी उपलब्ध हैं; आउटपुट ऑपरेशंस फ़ाइल पॉइंटर से शुरू बाइट लिखते हैं और लिखित बाइट्स के पीछे फ़ाइल पॉइंटर को अग्रिम करते हैं। आउटपुट ऑपरेशंस जो अंतर्निहित सरणी के वर्तमान छोर से पहले लिखते हैं, सरणी को विस्तारित किया जाता है। फ़ाइल सूचक को getFilePointer विधि द्वारा पढ़ा जा सकता है और खोज विधि द्वारा सेट किया जा सकता है।

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

+0

@MelNicholson जानना अच्छा है। धन्यवाद। – iphonedev7

+0

यह स्वीकार्य उत्तर होना चाहिए। – Makaveli84