2012-12-06 32 views
5

का उपयोग कर फ़ाइल की सामग्री को संशोधित करें मैं जावा प्रोग्राम का उपयोग कर फ़ाइल की कुछ सामग्री को हटाना चाहता हूं। क्या यह एक ही फ़ाइल में प्रतिस्थापित करने के लिए लिखने की विधि है या इसे दूसरी फ़ाइल में कॉपी किया जाना चाहिए।जावा

लेकिन यह फ़ाइल की सभी सामग्री को हटा रहा है।

class FileReplace 
{ 
    ArrayList<String> lines = new ArrayList<String>(); 
    String line = null; 
    public void doIt() 
    { 
     try 
     { 
      File f1 = new File("d:/new folder/t1.htm"); 
      FileReader fr = new FileReader(f1); 
      BufferedReader br = new BufferedReader(fr); 
      while (line = br.readLine() != null) 
      { 
       if (line.contains("java")) 
        line = line.replace("java", " "); 
       lines.add(line); 
      } 
      FileWriter fw = new FileWriter(f1); 
      BufferedWriter out = new BufferedWriter(fw); 
      out.write(lines.toString()); 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
    public statc void main(String args[]) 
    { 
     FileReplace fr = new FileReplace(); 
     fr.doIt(); 
    } 
} 
+0

मुझे लगता है कि आप केवल एक बार नाम br का उपयोग करना चाहिए;) – acostache

+0

1) उपयोग के बाद पाठक बंद: 'br.close()'; 2) आपके कोड में 'आउट' क्या है? 3) परिणाम क्या है, आपने क्या उम्मीद की थी? – Andy

उत्तर

11

मैं पाठक को बंद करने, और निस्तब्धता लेखक के साथ शुरू होगा:

public class FileReplace { 
    List<String> lines = new ArrayList<String>(); 
    String line = null; 

    public void doIt() { 
     try { 
      File f1 = new File("d:/new folder/t1.htm"); 
      FileReader fr = new FileReader(f1); 
      BufferedReader br = new BufferedReader(fr); 
      while ((line = br.readLine()) != null) { 
       if (line.contains("java")) 
        line = line.replace("java", " "); 
       lines.add(line); 
      } 
      fr.close(); 
      br.close(); 

      FileWriter fw = new FileWriter(f1); 
      BufferedWriter out = new BufferedWriter(fw); 
      for(String s : lines) 
       out.write(s); 
      out.flush(); 
      out.close(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public static void main(String args[]) { 
     FileReplace fr = new FileReplace(); 
     fr.doIt(); 
    } 
} 
+1

-1 मुझे 'बफरवाइटर' में कोई भी 'लेखन रेखा' नहीं मिल रही है, 'बंद करें' को कम करना चाहिए। –

2

यकीन करने के लिए करें:

  • close किसी भी स्ट्रीम जब आप अब उनके लेखन के लिए यह फिर से खोलने
  • विशेष में की जरूरत है से पहले।
  • truncate फ़ाइल, यह सुनिश्चित करने के लिए कि यदि आप उससे कम लिखते हैं तो यह कम हो जाता है।
  • फिर आउटपुट
  • व्यक्तिगत पंक्तियां लिखें, toString पर भरोसा न करें।
  • flush और close जब आप लिखना समाप्त कर लेंगे!

आप का उपयोग करते हैं बफ़र आईओ, आप हमेशा यह सुनिश्चित करें कि बफर अंत में प्लावित है है, या तो आप डेटा खो सकता है!

+0

कोड –

+0

के साथ मदद करें मुझे यकीन नहीं है कि वह एक ही समय में पढ़ रहा/लिख रहा है। वह लाइनों को एक सूची में पढ़ता है, फिर फ़ाइल को सूची लिखता है, या कम से कम प्रयास कर रहा है। – Qwerky

3

पढ़ें + उसी फ़ाइल को सिमुलेटेट से लिखना ठीक नहीं है।

संपादित करें: रीफ्रेज करने के लिए और अधिक सही और विशिष्ट - एक ही थ्रेड में, उसी पाठ में पढ़ने और लिखने के लिए, पाठक को ठीक से बंद किए बिना (और लेखक को बहाना) ठीक नहीं है।

+1

क्या आप कृपया विस्तार से बता सकते हैं? –

+1

हां, आम तौर पर बोलते हुए, एक कारण यह होगा क्योंकि जब भी आप लिखते हैं तो फाइल के भीतर ऑफसेट बदल जाएंगे और पढ़ा गया कर्सर उस पर नज़र रखेगा (यहां स्वीकृत उत्तर देखें: http://stackoverflow.com/questions/ 4251058/जावा-पढ़ने और लिखने-एक-फ़ाइल-साथ)। फिर भी, इस सवाल को दोबारा पढ़ने के बाद, यहां समस्या यह नहीं थी कि (मैंने बहुत तेज़ उत्तर दिया), लेकिन बंद होने और बहने की कोई फर्क नहीं पड़ता। – acostache

0

मैं तीन समस्याएं देख सकता हूं।

सबसे पहले आप out पर लिख रहे हैं जो मुझे लगता है कि System.out, फ़ाइल में आउटपुट स्ट्रीम नहीं है।

दूसरा, यदि आप फ़ाइल में आउटपुट स्ट्रीम को लिखते हैं, तो आपको इसे बंद करने की आवश्यकता है।

तीसरा, toString()ArrayList पर विधि आपके द्वारा अपेक्षित फ़ाइल को लिखने वाला नहीं है। सूची में लूप करें और एक समय में प्रत्येक String लिखें। खुद से पूछें कि क्या आपको न्यूलाइन अक्षरों को भी लिखना है या नहीं।

7

स्वीकार किए जाते हैं जवाब बहुत अच्छा है। हालांकि, वहाँ अपाचे के commons-io लाइब्रेरी का उपयोग कर एक फ़ाइल में सामग्री को बदलने के लिए एक आसान तरीका है (commons-io-2.4.jar - आप किसी भी नवीनतम संस्करण का उपयोग कर सकते)

private void update() throws IOException{ 
     File file = new File("myPath/myFile.txt"); 
     String fileContext = FileUtils.readFileToString(file); 
     fileContext = fileContext.replaceAll("_PLACEHOLDER_", "VALUE-TO-BE-REPLACED"); 
     FileUtils.write(file, fileContext); 
} 

नोट: फेंक IOException जरूरतों को पकड़ लिया और नियंत्रित किया जा करने के लिए आवेदन के द्वारा तदनुसार ।

0

स्वीकृत उत्तर थोड़ा गलत है। सही कोड यहाँ है।

public class FileReplace { 
List<String> lines = new ArrayList<String>(); 
String line = null; 

public void doIt() { 
    try { 
     File f1 = new File("d:/new folder/t1.htm"); 
     FileReader fr = new FileReader(f1); 
     BufferedReader br = new BufferedReader(fr); 
     while ((line = br.readLine()) != null) { 
      if (line.contains("java")) 
       line = line.replace("java", " "); 
      lines.add(line); 
     } 
     fr.close(); 
     br.close(); 

     FileWriter fw = new FileWriter(f1); 
     BufferedWriter out = new BufferedWriter(fw); 
     for(String s : lines) 
      out.write(s); 
     out.flush(); 
       } 
     out.close(); 
    catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 
+0

क्या आप कह सकते हैं कि स्वीकृत उत्तर गलत क्यों है? –

+1

हां। "out.close()" लूप के लिए "बाहर होना चाहिए। –

+0

यह लूप के बाहर है। 'For' लूप केवल अगली पंक्ति है, क्योंकि ब्रेसिज़ उत्सर्जित किए गए हैं। आपने इसे 'try' block के बाहर रखा है। पाठकों को {{} 'ब्लॉक का उपयोग करके 'बेहतर समाधान करना होगा –