devstory

Le Tutoriel de Java FilterWriter

  1. FilterWriter
  2. Examples

1. FilterWriter

FilterWriter est une sous-classe abstraite de la classe Writer. C'est la classe de base pour créer des sous-classes utilisées pour écrire de manière sélective les caractères requis.
FilterWriter n'écrit pas directement les caractères dans l'objectif (le fichier par exemple), mais gère un autre Writer qui est responsable de l'écriture des données sur l'objectif. FilterWriter filtre ou traite les caractères qui y sont écrits, puis écrit les résultats dans Writer qu'il gère.
Observer le code source de la classe FilterWriter: Toutes les méthodes dont elle hérite de la superclasse sont remplacées pour agir en tant que proxy de l'objet Writer qu'elle gère:
FilterWriter
public abstract class FilterWriter extends Writer {  
    protected Writer out;
    
    protected FilterWriter(Writer out) {
        super(out);
        this.out = out;
    }
    public void write(int c) throws IOException {
        out.write(c);
    }
    public void write(char cbuf[], int off, int len) throws IOException {
        out.write(cbuf, off, len);
    }
    public void write(String str, int off, int len) throws IOException {
        out.write(str, off, len);
    }
    public void flush() throws IOException {
        out.flush();
    }
    public void close() throws IOException {
        out.close();
    }
}
FilterWriter constructors
protected FilterWriter(Writer out)

2. Examples

ROT13 est un chiffrement par substitution de lettre (letter substitution cipher) simple, qui remplace chaque lettre par une autre qui se trouve à la treizième position après celle-ci dans l'alphabet. ROT13 est un cas simple du code César (Caesar cipher).
Vous trouverez ci-dessous un tableau de lettres et leurs substitutions correspondantes comme résultat de l'utilisation de l'algorithme ROT13.
L'alphabet Latin standard se compose de 26 lettres (2x13). Fondamentalement, l'algorithme ROT13 remplace une lettre par une autre et utilise ce même algorithme pour inverser le résultat. Par exemple, l'algorithme ROT13 transforme la lettre "A" en "N" et utilise l'algorithme ROT13 pour "N" pour obtenir "A" comme substitut.
ROT13 est souvent considéré comme un excellent exemple de cryptage (encryption) faible.
La classe ROT13 suivante fournit une méthode de rotation(int) statique qui accepte une lettre en entrée et renvoie une lettre de remplacement en sortie à l'aide de l'algorithme ROT13:
ROT13.java
package org.o7planning.filterwriter.ex;

public class ROT13 {

    /**
     * <pre>
     *   a <==> n
     *   b <==> o
     *   c <==> p
     *   d <==> q
     *   e <==> r
     *   ...
     *   y <==> l
     *   z <==> m
     * </pre>
     */
    public static int rotate(int inChar) {
        int outChar;

        if (inChar >= (int) 'a' && inChar <= (int) 'z') {
            outChar = (((inChar - 'a') + 13) % 26) + 'a';
        } else if (inChar >= (int) 'A' && inChar <= (int) 'Z') {
            outChar = (((inChar - 'A') + 13) % 26) + 'A';
        } else {
            outChar = inChar;
        }
        return outChar;
    }

    // Test
    public static void main(String[] args) {
        for (char ch = 'a'; ch <= 'z'; ch++) {
            char m = (char) rotate(ch);
            System.out.println(ch + " ==> " + m);
        }
        System.out.println(" --- ");
        for (char ch = 'A'; ch <= 'Z'; ch++) {
            char m = (char) rotate(ch);
            System.out.println(ch + " ==> " + m);
        }
    }
}
Ecrire la classe ROT13Writer étendue à partir de la classe FilterWriter. Les caractères écrits dans ROT13Writer seront remplacés à l'aide de l'algorithme ROT13:
ROT13Writer.java
package org.o7planning.filterwriter.ex;

import java.io.FilterWriter;
import java.io.IOException;
import java.io.Writer;
 
public class ROT13Writer extends FilterWriter {
 
    public ROT13Writer(Writer out) {
        super(out);
    }  
    
    @Override
    public void write(int outChar) throws IOException {
        super.write(ROT13.rotate(outChar));
    }
 
    @Override
    public void write(char[] cbuf, int offset, int length) throws IOException {
        char[] tempbuf = new char[length];
        for (int i = 0; i < length; i++) {
            tempbuf[i] = (char) ROT13.rotate(cbuf[offset + i]);
        }
        super.write(tempbuf, 0, length);
    }  
    
    @Override
    public void write(String str, int off, int len) throws IOException {
        char[] cbuf = str.toCharArray();
        this.write(cbuf, off, len);
    }
}
Un exemple de ROT13Writer:
ROT13WriterTest1.java
package org.o7planning.filterwriter.ex;

import java.io.FilterWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

public class ROT13WriterTest1 {

    public static void main(String[] args) throws IOException {
        Writer targetWriter = new StringWriter();
        FilterWriter filterWriter = new ROT13Writer(targetWriter);
        
        String inputString = "Hello";
        
        filterWriter.write(inputString);
        filterWriter.close();
        
        String outputString = targetWriter.toString();
        System.out.println(inputString + " ==> " + outputString);
    }
}
Output:
Hello ==> Uryyb
Un exemple sur l'utilisation de ROT13Writer pour écrire les données dans le fichier:
ROT13WriterTest2.java
package org.o7planning.filterwriter.ex;

import java.io.File;
import java.io.FileWriter;
import java.io.FilterWriter;
import java.io.IOException;
import java.io.Writer;

public class ROT13WriterTest2 {

    public static void main(String[] args) throws IOException {
        // Windows: C:/somedir/rot13-out-file.txt
        File outFile = new File("/Volumes/Data/test/rot13-out-file.txt");
        outFile.getParentFile().mkdirs();
        
        Writer targetWriter = new FileWriter(outFile);
        FilterWriter filterWriter = new ROT13Writer(targetWriter);
        
        String inputString = "Uryyb";
        
        filterWriter.write(inputString);
        filterWriter.close();
    }
}
Output:
rot13-out-file.txt
Hello

Tutoriels Java IO

Show More