2010-06-30 11 views
23

में स्ट्रिंग को बदलें, मैं पूरी फ़ाइल को स्मृति में पढ़ने के बिना फ़ाइल में स्ट्रिंग को प्रतिस्थापित करने का एक तरीका ढूंढ रहा हूं। आम तौर पर मैं एक रीडर और लेखक, यानी निम्नलिखित की तरह कुछ का प्रयोग करेंगे:फ़ाइल

public static void replace(String oldstring, String newstring, File in, File out) 
    throws IOException { 

    BufferedReader reader = new BufferedReader(new FileReader(in)); 
    PrintWriter writer = new PrintWriter(new FileWriter(out)); 
    String line = null; 
    while ((line = reader.readLine()) != null) 
     writer.println(line.replaceAll(oldstring,newstring)); 

    // I'm aware of the potential for resource leaks here. Proper resource 
    // handling has been omitted in the interest of brevity 
    reader.close(); 
    writer.close(); 
} 

हालांकि, मैं यथा-स्थान प्रतिस्थापन करना चाहते हैं, और नहीं लगता कि मैं एक रीडर और लेखक एक ही पर खुला हो सकता है एक साथ फ़ाइल। इसके अलावा, मैं जावा 1.4 का उपयोग कर रहा है, तो dont't NIO, स्कैनर, आदि के लिए उपयोग किया

धन्यवाद, डॉन

+1

बस एफवाईआई, आपको पता है कि 'replaceAll' regex- आधारित है, है ना? यदि आप सीधे स्ट्रिंग शाब्दिक प्रतिस्थापन करना चाहते हैं (जैसा कि आपके औपचारिक पैरामीटर नाम सुझाव देते हैं), तो आप इसके बजाय 'प्रतिस्थापन (CharSequence, CharSequence)' विधि का उपयोग कर सकते हैं। – polygenelubricants

+0

एक अस्थायी फ़ाइल में लिखने और फिर मूल को बदलने के बारे में क्या? – InsertNickHere

उत्तर

31

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

यह भी लाभ है कि प्रश्न में फ़ाइल मूल स्थिति में या पूरी तरह से प्रतिस्थापित स्थिति में, कभी भी बीच में नहीं होती है।

+3

+1 एक अच्छी तरह से समझाया उत्तर के लिए – naikus

2

फ़ाइल या स्ट्रीम में कुछ को बदलने के लिए एक लेखक या आउटपुटस्ट्रीम की आवश्यकता होती है जो किसी भी स्थिति में बाइट को हटाने और डालने में सक्षम है। एक प्रतिस्थापन ऑपरेशन को में विभाजित किया जा सकता है और ऑपरेशन डालें।

आउटपुटस्ट्रीम और राइटर के एपीआई को देखते हुए मुझे उपयुक्त तरीके नहीं मिल रहे हैं। कोई ऑफसेट के साथ बाइट्स लिखने के लिए आउटपुटस्ट्रीम का उपयोग कर सकता है लेकिन यह केवल मौजूदा संदर्भ को ओवरराइट करेगा। तो यह विशेष मामले के लिए काम कर सकता है, कि मूल और प्रतिस्थापन बराबर लंबाई है।

तो अभी मुझे लगता है कि संपादित लाइनों को एक अस्थायी फ़ाइल में लिखना और बाद में अस्थायी फ़ाइल को अस्थायी फ़ाइल के साथ बदलना अभी भी सबसे अच्छा समाधान है।