Class Reader probleme methode mark()

Résolu/Fermé
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 - Modifié par totodunet le 27/03/2014 à 20:01
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 - 27 mars 2014 à 22:20
Bonjour,

Je développe sous Netbeans et j'ai un projet à réaliser qui lit une expression booléenne dans un fichier et l'évalue.
Pour lire j'utilise la classe Reader, le problème est que j'ai un message d'erreur de compilation m'indiquant que le flux ne "supporte" pas la méthode mark() que j'utilise.

C'est un fichier .txt que je lit. Je ne comprend vraiment pas pourquoi il supporte pas le fait de pouvoir enregistré la position et pouvoir revenir dessus avec reset().

Ou bien il faut peut-être faire quelque chose pour que le flux de lecture supporte ce genre de méthode?

Aussi dans NetBeans, (chose assez étrange), on peut voir le code source des classes Java. Et quand je débogue, je rencontre ceci dans Reader.java :

/**
     * Tells whether this stream supports the mark() operation. The default
     * implementation always returns false. Subclasses should override this
     * method.
     *
     * @return true if and only if this stream supports the mark operation.
     */
    public boolean markSupported() {
        return false;
    }

    /**
     * Marks the present position in the stream.  Subsequent calls to reset()
     * will attempt to reposition the stream to this point.  Not all
     * character-input streams support the mark() operation.
     *
     * @param  readAheadLimit  Limit on the number of characters that may be
     *                         read while still preserving the mark.  After
     *                         reading this many characters, attempting to
     *                         reset the stream may fail.
     *
     * @exception  IOException  If the stream does not support mark(),
     *                          or if some other I/O error occurs
     */
    public void mark(int readAheadLimit) throws IOException {
        throw new IOException("mark() not supported");
    }


alors je sais pas si c'est NetBeans le probleme ou moi.

Merci pour vos réponses



Qui ne tente rien n'a rien
A voir également:

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
27 mars 2014 à 20:11
Bonsoir,

Reader est une classe abstraite et markSupported() est une méthode optionnelle, donc par défaut la méthode mark renvoie une exception comme quoi la méthode n'est pas pris en charge. Ce qu'il faudrait vraiment regarder ce n'est pas la classe Reader - puisqu'elle est abstraite - mais la classe réelle que tu utilises, celle où tu fais ton new, et éventuellement la changer afin de considérer une classe qui supporte cette option.

Dans tous les cas, un code propre devrait être :

if (reader.markSupported())
    reader.mark(limit);
else
    // Erreur
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
27 mars 2014 à 20:32
bonsoir,

merci pour votre reponse.

la classe instanciée est FileReader. J'ai essayé de remplacé FileReader par Reader mais ça ne change rien, elle hérite directement de Reader. La méthode mark() et reset() et d'autres ne sont pas redéfinies.

en fait je m'explique j'ai une classe test dont voici un bout de code :

if (args.length != 0)
        {
            File f = new File(args[0]);
            FileReader fr = new FileReader(f);
            SeqLexeme sl = new SeqLexeme(fr);
            Lexeme l = null;
            do
            {
                l = sl.lexemeSuivant();
                System.out.println(l);
            }
            while (l.donneType() != TypeLexeme.L_FIN);
        }


et moi je doit faire la classe SeqLexeme représentant une séquence de lexemes avec la méthode lexemeSuivant() qui donne un lexeme.

Dans ma classe SeqLexeme, j'ai un attribut qui est de type Reader et que j'initialise dans le constructeur :

public class SeqLexeme {
    
    //ATTRIBUTS
    private Reader r;
    
    //CONSTRUCTEUR
    public SeqLexeme(Reader lecteur){
        this.r=lecteur;
    }

0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
27 mars 2014 à 21:36
Pour l'instant je ne vois toujours pas ce que tu cherches à faire ni pourquoi tu as besoin d'utiliser mark() vu que dans le code que tu nous donnes tu en t'en sers pas...

Tu dis que FileReader hérite directement de Reader, ce n'est pas tout à fait vrai, il y a la classe InputStreamReader entre les deux (FileReader extends InputStreamReader, InputStreamReader extends Reader). Mais effectivement mark() n'est pas redéfini donc tu ne peux pas l'utiliser.

Un FileReader se contente de faire les entrées/sorties sans rien garder en mémoire, tu ne peux donc pas utiliser mark. Mais en utilisant un BufferedReader par dessus tu devrais pouvoir utiliser cette fonctionnalité, ce qui requiert une mise en mémoire d'une partie du fichier et alourdit donc les traitements, c'est pour ça que ce n'est pas implémenté par défaut.

Reader markableReader = new BufferedReader(new FileReader(args[0]));
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
27 mars 2014 à 22:20
je me suis rendu compte que dans le fichier texte les lexèmes constitués de plusieurs caractères étaient séparés d'espaces. avec une petite récursivité qui prend le lexeme suivant quand il lit un espace c'est tout bon!

merci beaucoup j'ai réussi sans avoir à utiliser mark() finalement

sinon j'aurai bien fait différemment mais je n'ai pas le droit de modifier les constructeurs et entêtes fournies par le professeur. en réalité je dois juste compléter le vide et donc je devais me débrouiller avec Reader.

Le but du projet en fait c'est de pouvoir ensuite manipuler des arbres contenant des lexemes et après évaluer ou simplifier des expressions booleenes plus ou moins longues en parcourant les arbres. assez intéressant...

merci KX!
0