2010-08-31 31 views
5

से वर्ण को हटाएं या अनदेखा करें मैं सभी पात्रों को स्ट्रीम में पढ़ रहा हूं। मैं इसे inputStream.read के साथ पढ़ रहा हूँ। यह java.io.Reader इनपुटस्ट्रीम है। बफर में पढ़ने पर @ जैसे विशेष वर्णों को मैं अनदेखा कैसे कर सकता हूं।पाठक

कोड

private final void FillBuff() throws java.io.IOException 
    { 
    int i; 
    if (maxNextCharInd == 4096) 
     maxNextCharInd = nextCharInd = 0; 

    try { 
     if ((i = inputStream.read(nextCharBuf, maxNextCharInd, 
              4096 - maxNextCharInd)) == -1) 
     { 
      inputStream.close(); 
      throw new java.io.IOException(); 
     } 
     else 
      maxNextCharInd += i; 
     return; 
    } 
    catch(java.io.IOException e) { 
     if (bufpos != 0) 
     { 
      --bufpos; 
      backup(0); 
     } 
     else 
     { 
      bufline[bufpos] = line; 
      bufcolumn[bufpos] = column; 
     } 
     throw e; 
    } 
    } 

उत्तर

0

तुम एक स्वयं InputStream InputStream से प्राप्त लागू कर सकता है। फिर पढ़ने के तरीकों को ओवरराइड करें ताकि वे स्ट्रीम के बाहर एक विशेष चरित्र फ़िल्टर कर सकें।

+0

इनपुटस्ट्रीम बाइट्स पढ़ते हैं, वर्ण नहीं। आपका मतलब रीडर है। –

+0

ओह। माफ़ कीजिये। बेशक - मेरा मतलब पाठक वर्ग है। –

0
private final void FillBuff() throws java.io.IOException 
{ 
int i; 
if (maxNextCharInd == 4096) 
    maxNextCharInd = nextCharInd = 0; 

try { 
    Reader filterReader = new FilterReader(inputStream) { 
     public int read() { 
      do { 
       result = super.read(); 
      } while (specialCharacter(result)); 
      return result; 
     } 
    }; 
    if ((i = filterReader.read(nextCharBuf, maxNextCharInd, 
             4096 - maxNextCharInd)) == -1) 
    { 
     inputStream.close(); 
     throw new java.io.IOException(); 
    } 
    else 
     maxNextCharInd += i; 
    return; 
} 
catch(java.io.IOException e) { 
    if (bufpos != 0) 
    { 
     --bufpos; 
     backup(0); 
    } 
    else 
    { 
     bufline[bufpos] = line; 
     bufcolumn[bufpos] = column; 
    } 
    throw e; 
} 
} 
+0

हाय, किस प्रकार का परिणाम है? – bombac

+0

और विशेष कैरेक्टर विधि क्या है? – bombac

7

आप एक कस्टम FilterReader का उपयोग कर सकते हैं।

class YourFilterReader extends FilterReader{ 
    @Override 
    public int read() throws IOException{ 
     int read; 
     do{ 
      read = super.read(); 
     } while(read == '@'); 

     return read; 
    } 

    @Override 
    public int read(char[] cbuf, int off, int len) throws IOException{ 
     int read = super.read(cbuf, off, len); 

     if (read == -1) { 
      return -1; 
     } 

     int pos = off - 1; 
     for (int readPos = off; readPos < off + read; readPos++) { 
      if (read == '@') { 
       continue; 
      } else { 
       pos++; 
      } 

      if (pos < readPos) { 
       cbuf[pos] = cbuf[readPos]; 
      } 
     } 
     return pos - off + 1; 
    } 
} 

संसाधन:

एक ही विषय पर:

+0

हाँ, एक नया सजावट जाने का रास्ता है। – atamanroman

+0

बस एक नोट। दूसरी विधि में तर्क गुम हैं। ;) –

+0

@ codeing.mof, धन्यवाद, यह सही है। –

4

उन सभी पाठकों, लेखकों और धाराओं डेकोरेटर पैटर्न को लागू। प्रत्येक सजावटी अंतर्निहित कार्यान्वयन के लिए अतिरिक्त व्यवहार और कार्यक्षमता जोड़ता है।

आप की आवश्यकता के लिए एक समाधान एक FilterReader हो सकता है:

public class FilterReader implements Readable, Closeable { 
    private Set<Character> blacklist = new HashSet<Character>(); 
    private Reader reader;  

    public FilterReader(Reader reader) { 
    this.reader = reader; 
    } 

    public void addFilter(char filtered) { 
    blacklist.add(filtered); 
    } 

    @Override 
    public void close() throws IOException {reader.close();} 

    @Override 
    public int read(char[] charBuf) { 
    char[] temp = new char[charBuf.length]; 
    int charsRead = reader.read(temp); 
    int index = -1; 
    if (!(charsRead == -1)) { 
     for (char c:temp) { 
     if (!blacklist.contains(c)) { 
      charBuf[index] = c; 
      index++; 
     } 
     } 
    } 
    return index; 
    } 

} 

नोट - वर्ग java.io.FilterReader शून्य कार्यशीलता के साथ एक डेकोरेटर है। आप इसे बढ़ा सकते हैं या बस इसे अनदेखा कर सकते हैं और अपना स्वयं का सजावटी बना सकते हैं (जिसे मैं इस मामले में पसंद करता हूं)।

+0

'पढ़ने (char [])' विधि के साथ, मुझे लगता है कि आपको 'charBuf' भरने तक पढ़ना जारी रखना चाहिए। आपका कार्यान्वयन केवल अगले 'charbuf.length' तत्वों में मान्य तत्वों को पढ़ता है। 'सेट' के साथ समग्र रूप से अच्छा कार्यान्वयन - शायद मैं 'सेट' पैरामीटर के साथ एक और कन्स्ट्रक्टर शामिल करूंगा - लेकिन यह वास्तव में यहां महत्वपूर्ण नहीं है। –

+0

मैं 'java.io.FilterReader' का विस्तार करूंगा, यह आपकी कक्षा को रीडर के रूप में रखने के लिए उपयोगी हो सकता है, और स्पष्ट रूप से कहता है कि यह एक इनपुट वर्ण स्ट्रीम फ़िल्टर करने के लिए बनाया गया पाठक है। और बहुरूपता अभी भी उपलब्ध होगी। और आपके मामले में, आप अपनी कक्षा को किसी अन्य रीडर में समाहित नहीं कर सकते हैं, क्योंकि यह एक और पाठक नहीं है। –

+0

यिक्स - 'रीडर' एक इंटरफेस नहीं बल्कि एक अमूर्त वर्ग है। कार्यान्वयन बदल दिया ... –

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