2010-08-31 26 views
5

Estoy leyendo todos los caracteres en la secuencia. Lo estoy leyendo con inputStream.read. Esto es java.io.Reader inputStream. ¿Cómo puedo ignorar caracteres especiales como @ al leer en el búfer?Eliminar o ignorar el carácter del lector

código

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; 
    } 
    } 

Respuesta

0

Se podría implementar un flujo de entrada propia derivada de InputStream. A continuación, anule los métodos de lectura para que filtren un carácter especial fuera de la secuencia.

+0

InputStreams leen bytes, no caracteres. Te refieres a Reader. –

+0

oh. lo siento. por supuesto, me refiero a la clase Reader. –

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

hola, ¿qué tipo es el resultado? – bombac

+0

y ¿cuál es el método especial del personaje? – bombac

7

Puede usar un FilterReader personalizado.

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; 
    } 
} 

Recursos:

Sobre el mismo tema:

+0

Sí, un nuevo Decorador es el camino a seguir. – atamanroman

+0

Solo una nota. En el segundo método, faltan los argumentos. ;) –

+0

@ codeing.mof, gracias, está corregido. –

4

Todos aquellos lectores, escritores y arroyos implementar el decorador patrón. Cada decorador agrega comportamiento y funcionalidad adicionales a la implementación subyacente.

Una solución para usted requisito podría ser un 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; 
    } 

} 

Nota - la clase java.io.FilterReader es un decorador con funcionalidad cero. Puede ampliarlo o simplemente ignorarlo y crear su propio decorador (que prefiero en este caso).

+0

Con el método 'read (char [])', creo que deberías seguir leyendo hasta que 'charBuf' esté lleno. Su implementación solo lee los elementos válidos en los siguientes elementos 'charbuf.length'. Una buena implementación en general con el 'Set' - quizás incluiría otro constructor con un parámetro' Set' - pero eso no es tan importante aquí. –

+0

Extendería 'java.io.FilterReader', podría ser útil mantener su clase como lector, y explícitamente decir que es un lector creado para filtrar una secuencia de caracteres de entrada. Y el polimorfismo aún estaría disponible. Y en su caso, no puede encapsular su clase en otro Reader, porque no es otro Reader. –

+0

Yikes - 'Reader' no es una interfaz sino una clase abstracta. Cambió la implementación ... –

Cuestiones relacionadas