2010-07-15 19 views
7

मैं इनपुट स्ट्रीम को "संशोधित" कैसे कर सकता हूं? मेरे पास इनपुट के रूप में एक फ़ाइल है, मैं कुछ चर को संशोधित करना चाहता हूं और एक नया इनपुटस्ट्रीम अग्रेषित करना चाहता हूं।प्रक्रिया इनपुट स्ट्रीम

उदाहरण के लिए, प्रारंभिक इनपुटस्ट्रीम में हैलो $ {var} शामिल है। फिर मैं इस इनपुटस्ट्रीम को var = "world" के साथ "संशोधित" करना चाहता हूं, जिसके परिणामस्वरूप इनपुट इनपुट हैलो वर्ल्ड।

ऐसा करने का सबसे अच्छा अभ्यास क्या है? धन्यवाद।

उत्तर

12

java.io एक और सभी decorator pattern है। इसका उपयोग करें और extends InputStream (शायद DataInputStream या बेहतर, कुछ Reader, क्योंकि आप वास्तव में वर्णों में रुचि रखते हैं, बाइट्स में नहीं, बल्कि एला), एक रचनाकार जोड़ें जो मूल InputStream लेता है और पढ़ने के लिए read() विधियों को ओवरराइड करता है मूल धारा में, इसे एक निश्चित डिग्री (उदाहरण के लिए ${ से पहलेनेक्स्ट }) तक बफर करें और फिर कुंजी निर्धारित करें और इसके बजाय संशोधित डेटा वापस करें।

तो आप अपने नए वर्ग FormattedInputStream या तो फोन है, तो आप new FormattedInputStream(originalInputStream) enduser के बजाय लौट सकते हैं और enduser अभी भी आवंटित और एक InputStream रूप में इसका इस्तेमाल हो सकता था।

+0

+1 - इस उत्तर ने मुझे तुरंत अपना टेक्स्ट हटा दिया। –

+0

हाय @ बालससी क्या आपका उत्तर एक्सेल फाइलों पर भी लागू है? मैं इनपुटस्ट्रीम संपादित करना चाहता हूं और इसे उपयोगकर्ता को भेजना चाहता हूं। यहां मेरी पोस्ट है: http://stackoverflow.com/questions/34893954/grails-edit-form-multipart-file-from-client-and-send-it-back-to-the-clien?noredirect=1#comment57594193_34893954 धन्यवाद आप। – user3714598

3

आप FilterInputStream उपclassing करने का प्रयास कर सकते हैं।

डॉक्स से

:

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

यहाँ यह पर एक प्रारंभिक वार है। इसे हल करने का सबसे अच्छा तरीका नहीं है। आप शायद कुछ और तरीकों को ओवरराइड करना चाहते हैं, और शायद इसके बजाय एक पाठक के साथ जाना चाहते हैं। (या शायद यह भी एक स्कैनर का उपयोग करें और लाइन द्वारा फ़ाइल लाइन की प्रक्रिया।)

import java.io.*; 
import java.util.*; 

public class Test { 
    public static void main(String args[]) throws IOException { 
     String str = "Hello world, this is the value one ${bar} and this " + 
        "is the value two ${foo}"; 

     // The "original" input stream could just as well be a FileInputStream. 
     InputStream someInputStream = new StringBufferInputStream(str); 

     InputStream modified = new SubstitutionStream(someInputStream); 
     int c; 
     while ((c = modified.read()) != -1) 
      System.out.print((char) c); 

     modified.close(); 
    } 
} 


class SubstitutionStream extends FilterInputStream { 

    Map<String, String> valuation = new HashMap<String, String>() {{ 
     put("foo", "123"); 
     put("bar", "789"); 
    }}; 

    public SubstitutionStream(InputStream src) { 
     super(src); 
    } 

    LinkedList<Character> buf = new LinkedList<Character>(); 

    public int read() throws IOException { 

     if (!buf.isEmpty()) 
      return buf.remove(); 

     int c = super.read(); 

     if (c != '$') 
      return c; 

     int c2 = super.read(); 

     if (c2 == '{') { 
      StringBuffer varId = new StringBuffer(); 
      while ((c2 = super.read()) != '}') 
       varId.append((char) c2); 

      for (char vc : valuation.get(varId.toString()).toCharArray()) 
       buf.add(vc); 

      return buf.remove(); 

     } else { 
      buf.add((char) c2); 
      return c; 
     } 
    } 
} 

आउटपुट:

Hello world, this is the value one 789 and this is the value two 123 
+0

यही कारण है कि मैंने 'DataInputStream' का सुझाव दिया :) (जो इसका उप-वर्ग है)। हालांकि, आखिरकार, 'रीडर' ('इनपुटस्ट्रीम रीडर') का आंतरिक रूप से उपयोग करना आसान है। – BalusC

+0

आह, मुझे एहसास नहीं हुआ कि DataInputStream एक फ़िल्टर इनपुट स्ट्रीम था। (यद्यपि समझ में आता है।) तो DataInputStream क्या प्रदान करता है कि फ़िल्टर इनपुट स्ट्रीम नहीं करता है (यह इस स्थिति में उपयोगी है।) – aioobe

2

आप Streamflyer जो चरित्र में पाठ प्रतिस्थापन का समर्थन करता है बॉक्स से बाहर धाराओं इस्तेमाल कर सकते हैं।

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