Wir wollen im Folgenden einen Filter schreiben, der alle in den Strom geschriebenen Zeichen in Kleinbuchstaben umwandelt. Drei Dinge sind für einen eigenen FilterWriter nötig:
- Die Klasse leitet sich von FilterWriter
- Unser Konstruktor nimmt als Parameter ein Writer-Objekt und ruft mit super(out) den Konstruktor der Oberklasse auf, also FilterWriter. Die Oberklasse speichert das übergebene Argument in der geschützten Objektvariablen out, sodass die Unterklassen darauf zugreifen können.
- Wir überlagern die drei write(…)-Methoden und eventuell noch close() und flush(). Unsere write(…)-Methoden führen dann die Filteroperationen aus und geben die wahren Daten an den Writer
class LowerCaseWriter extends FilterWriter { public LowerCaseWriter( Writer writer ) { super( writer ); } @Override public void write( int c ) throws IOException { out.write( Character.toLowerCase((char)c) ); } @Override public void write( char[] cbuf, int off, int len ) throws IOException { write( String.valueOf( cbuf ), off, len ); } @Override public void write( String s, int off, int len ) throws IOException { out.write( s.toLowerCase(), off, len ); } }
Und die Nutzung sieht dann so aus:
StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter( new LowerCaseWriter( sw ) ); pw.println( "Eine Zeile für klein und groß" ); System.out.println( sw.toString() );