2012-05-02 18 views
6

से एक स्ट्रिंग सेगमेंट को प्रतिस्थापित करें, मैं इनपुटस्ट्रीम के रूप में एक विशाल टेक्स्ट फ़ाइल प्राप्त करने का प्रयास कर रहा हूं और स्ट्रिंग सेगमेंट को किसी अन्य स्ट्रिंग के साथ कनवर्ट करना चाहता हूं। मैं कड़ाई से उलझन में हूं कि इसे कैसे किया जाए, यह अच्छी तरह से काम करता है अगर मैं पूरी इनपुटस्ट्रीम को एक स्ट्रिंग के रूप में परिवर्तित करता हूं जिसे मैं नहीं चाहता क्योंकि कुछ सामग्री खो जाती है। क्या कोई इसे मदद करने में मदद कर सकता है ?? उदा। यदि मेरे पास एक फ़ाइल है जिसमें सामग्री है "यह परीक्षण स्ट्रिंग है जिसे संशोधित करने की आवश्यकता है"। मैं इस स्ट्रिंग को इनपुट स्ट्रीम के रूप में स्वीकार करना चाहता हूं और सामग्री को संशोधित करना चाहता हूं "यह परीक्षण स्ट्रिंग है जिसे संशोधित किया गया है", ('की आवश्यकता है' को बदलकर)।इनपुट स्ट्रीम

public static void main(String[] args) { 
     String string = "This is the test string which needs to be modified"; 
     InputStream inpstr = new ByteArrayInputStream(string.getBytes()); 
      //Code to do 


    } 

इस में मैं उत्पादन चाहते हैं के रूप में: इस परीक्षा स्ट्रिंग जो

संशोधित किया गया है पहले से आपको धन्यवाद है।

+0

मैं लाइनों में इनपुट स्ट्रीम (एक BufferedReader throuh) पढ़ा था और प्रदर्शन आउटपुट भेजने से पहले एक पूरी लाइन पर प्रतिस्थापन। अधिक सुरुचिपूर्ण तरीका, BufferedReader से मेरा WholeLineChangerInputStream subclass, readLine() विधि (प्रतिस्थापन लागू) को ओवरराइड करें और उस ^^ – BigMike

+0

का उपयोग करें मूल रूप से आपको इसकी आवश्यकता है: http://tutorials.jenkov.com/java-howto/replace-strings- in-streams-arrays-files.html और उसके बाद इसे इनपुटस्ट्रीम – bvdb

उत्तर

2

क्या मुझे आपको गलत समझा जा सकता है, लेकिन मुझे लगता है कि आपको एक स्टैक मशीन बनाना चाहिए। मेरा मतलब है कि आप पाठ एकत्र करने और प्रतिस्थापन की स्थिति की जांच करने के लिए एक छोटे स्ट्रिंग स्टैक का उपयोग कर सकते हैं।

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

यदि आपका ढेर हालत के समान है, तो इसे एकत्रित करें।

यदि आपका स्टैक आपकी हालत से मेल खाता है, तो एक संशोधन करें और आउटपुट में संशोधित स्टैक फ्लश करें।

+0

+1 पर लागू करें। मुझे आपके सुझाव के लिए स्टैक अवधारणा – BigMike

+0

धन्यवाद पसंद है .. मैं अपना कोड डालने और अपडेट करने के लिए धन्यवाद .. – ranjan

+1

मुझे कुछ समान और उपयोग करने के लिए तैयार मिला (मेरे लिए काम करता है, याय!) Http://tech.joshuacummings.com/ 2012/02/खोज-और-प्रतिस्थापन-इनपुट-स्ट्रीम.html –

4

पाठ परिवर्तित करने की तो होगा हमेशा एक तार्किक लाइन में फिट, के रूप में मैं टिप्पणी में कहा गया है, मैं सरल रेखा पढ़ना के साथ जाना चाहते हैं (यदि applyable) की तरह कुछ का उपयोग कर:

public class InputReader { 
    public static void main(String[] args) throws IOException 
    { 
     String string = "This is the test string which needs to be modified"; 
     InputStream inpstr = new ByteArrayInputStream(string.getBytes()); 

     BufferedReader rdr = new BufferedReader(new InputStreamReader(inpstr)); 
     String buf = null; 
     while ((buf = rdr.readLine()) != null) { 
      // Apply regex on buf 

      // build output 
     } 
    } 
} 

हालांकि मैं

class MyReader extends BufferedReader { 
    public MyReader(Reader in) 
    { 
     super(in); 
    } 

    @Override 
    public String readLine() throws IOException { 
     String lBuf = super.readLine(); 
     // Perform matching & subst on read string 
     return lBuf; 
    } 
} 

और मानक BufferedReader प्रतिस्थापन ReadLine विधि अंदर छुपा रखने के स्थान पर MyReader का उपयोग करें: इसलिए मैं इस कहीं निर्धारित करेंगे हमेशा विरासत का उपयोग करना चाहते कर दिया है।

पेशेवर: प्रतिस्थापन तर्क एक निर्दिष्ट पाठक में है, कोड बहुत मानक है। विपक्ष: यह फोन करने वाले के लिए प्रतिस्थापन तर्क छुपाता

HTH (कभी कभी यह भी एक समर्थक है, अभी भी यह उपयोग मामले पर निर्भर करता है)

+0

धन्यवाद इससे मदद मिली .. लेकिन समस्या तब होती है जब मेरे पास पिछली पंक्ति में कुछ भाग और अगली पंक्ति में कुछ भाग होता है .. मुझे पैटर्न के साथ समस्या का सामना करना पड़ता है मिलान .. मैं इसे हल करने की कोशिश कर रहा हूं .. – ranjan

+0

उस मामले में, निकोले द्वारा सुझाए गए स्टैक मशीन का बेहतर उपयोग करें। मैं इसे एक कस्टम इनपुटस्ट्रीम (या BufferedReader) में एम्बेडेड रखूंगा। लिखने के लिए थोड़ा मुश्किल हो सकता है, लेकिन 99% मामलों को कवर करेगा। – BigMike

+0

@ बिगमाइक उस समाधान में केवल 'readLine() 'विधि को शामिल किया गया है, अभी भी' read()' और 'read (char [])' अनदेखा डेटा स्रोत के साथ रहता है।मैं सही समाधान की तलाश में हूं लेकिन अपाचे कॉमन्स आईओ में भी सही कार्यान्वयन नहीं है (https://issues.apache.org/jira/browse/IO-218 2013 में अव्यवस्थित)। –

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