Decorator Pattern (padrão de desenho)/Composição de streams em Java

From Wiki**3

< Decorator Pattern (padrão de desenho)

Composição de streams em Java

O seguinte exemplo ilustra a programação de um stream em Java: este stream vai ser aplicado como um decorator.

Classe que implementa o decorator

Note-se como o método read "decora" a acção do método correspondente na superclasse: o objecto decorador continua a permitir a leitura (como se de um stream se tratasse), mas altera os valores lidos.

public class LowerCaseInputStream extends FilterInputStream {
 
  public LowerCaseInputStream(InputStream in) {
    super(in);
  }

  public int read() throws IOException {
    int c = super.read();
    return (c == -1 ? c : Character.toLowerCase((char)c));
  }
               
  public int read(byte[] b, int offset, int len) throws IOException {
    int result = super.read(b, offset, len);
    for (int i = offset; i < offset+result; i++) {
      b[i] = (byte)Character.toLowerCase((char)b[i]);
    }
    return result;
  }

}

Exemplo: Classe de Teste

Este exemplo mostra a utilização da classe e a utilização transparente do método read.

 public class InputTest {
 
   public static void main(String[] args) throws IOException {
     int c;
 
     try {
 
       InputStream in = 
         new LowerCaseInputStream(
           new BufferedInputStream(
             new FileInputStream("test.txt")));
 
       while ((c = in.read()) >= 0)
         System.out.print((char)c);
 
       in.close();
 
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
 
 }