devstory

Le Tutoriel de Java FilterReader

  1. FilterReader
  2. Examples

1. FilterReader

FilterReader est une sous-classe abstraite de la classe Reader, qui est la classe de base utilisée pour créer des sous-classes permettant de lire de manière sélective les caractères requis. Par exemple, vous souhaitez lire un document HTML et ignorer les balises. Vous devez écrire une sous-classe de FilterReader, vous ne pouvez pas utiliser directement FilterReader, car il s'agit d'une classe abstraite.
FilterReader ne lit pas directement les données à partir de l'origine (un fichier, par exemple), mais il gère un autre Reader chargé de lire les données à partir de l'origine. FilterReader exécute de manière sélective les données obtenues à partir de Reader qu'il gère.
Un regard sur la source code de la classe FilterReader montre: Toutes les méthodes dont il hérite de la classe parentale ont été remplacées pour agir en tant que délégué de l'objet Reader qu'il gère:
FilterReader class
package java.io;

public abstract class FilterReader extends Reader {
    protected Reader in;
 
    protected FilterReader(Reader in) {
        super(in);
        this.in = in;
    }
    public int read() throws IOException {
        return in.read();
    }
    public int read(char cbuf[], int off, int len) throws IOException {
        return in.read(cbuf, off, len);
    }
    public long skip(long n) throws IOException {
        return in.skip(n);
    }  
    public boolean ready() throws IOException {
        return in.ready();
    }
    public boolean markSupported() {
        return in.markSupported();
    }
    public void mark(int readAheadLimit) throws IOException {
        in.mark(readAheadLimit);
    }
    public void reset() throws IOException {
        in.reset();
    }
    public void close() throws IOException {
        in.close();
    }
}
FilterReader​ constructors
protected FilterReader​(Reader in)

2. Examples

Par exemple: Ecrire une sous-classe de FilterReader pour lire le texte HTML mais ignorer les étiquettes (tag).
RemoveHtmlTagReader.java
package org.o7planning.filterreader.ex;

import java.io.FilterReader;
import java.io.IOException;
import java.io.Reader;

public class RemoveHtmlTagReader extends FilterReader {

    private boolean intag = false;

    public RemoveHtmlTagReader(Reader in) {
        super(in);
    }

    // We override this method.
    // The principle will be:
    // Read only characters outside of the tags.
    @Override
    public int read(char[] buf, int from, int len) throws IOException {

        int charCount = 0;

        while (charCount == 0) {
            charCount = super.read(buf, from, len);
            if (charCount == -1) {
                // Ends of
                return -1;
            }
            int last = from;

            for (int i = from; i < from + charCount; i++) {
                // If not in tag
                if (!this.intag) {
                    if (buf[i] == '<') {
                        this.intag = true;
                    } else {
                        buf[last++] = buf[i];
                    }
                } else if (buf[i] == '>') {
                    this.intag = false;
                }
            }
            charCount = last - from;
        }
        return charCount;
    }

    // Also need to override this method.
    @Override
    public int read() throws IOException {
        char[] buf = new char[1];
        int result = read(buf, 0, 1);
        if (result == -1) {
            return -1;
        } else {
            return (int) buf[0];
        }
    }
}
RemoveHtmlTagTest.java
package org.o7planning.filterreader.ex;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
 
public class RemoveHtmlTagTest {
 
    public static void main(String[] args) throws IOException {
        // Create a Reader.
        Reader in = new StringReader("<h1>Hello \n <b>World</b><h1>");
 
        RemoveHtmlTagReader filterReader = new RemoveHtmlTagReader(in);
        BufferedReader br = new BufferedReader(filterReader);
 
        String s = null;
        while ((s = br.readLine()) != null) {
            System.out.println(s);
        }
        br.close();
    }
}
Output:
Hello
 World

Tutoriels Java IO

Show More