La classe scanner

Introduction

Une classe a fait son apparition dans le package java.util dans la version 1.5.0 de java

Cette classe s'interface parfaitement avec des flux de lecture pour y permettre une lecture puissante et pratique !

Utilisation

Regardons les constructeurs :

Scanner(File source) 

Scanner(File source, String charsetName) 

Scanner(InputStream source) 

Scanner(InputStream source, String charsetName) 

Scanner(Readable source) 

Scanner(ReadableByteChannel source) 

Scanner(ReadableByteChannel source, String charsetName) 

Scanner(String source) 

On se rend vite compte que cette classe peu lire dans n'importe quoi !

Tentons une expérience ?.

Nous voyons Scanner(InputStream source) et nous savons que dans la classe System il y a la variable in qui permet de lire le clavier :

public static final InputStream            in
The "standard" input stream. This stream is already open and ready to supply input data. Typically this stream corresponds to keyboard input or another input source specified by the host environment or user. 

Alors pourquoi pas ? Essayons un petit programme tout bête qui affiche ce qu'écris l'utilisateur:

import java.util.Scanner;

public class Essai {
    public static void main(String *  args) {
        Scanner sc  = new Scanner(System.in);
        String s =  "";
        while(s.compareTo("ok")!=0){
            s = sc.nextLine();
            System.out.println(s);
        }
    }
}

Miracle ca marche !!! Simple non ?

Maintenant je ne sais pas vous mais un constructeur qui m'a beaucoup étonné est Scanner(String)

Essayons quelque chose avec les méthodes disponibles :

import java.util.Scanner;

public class Essai {
    public static void main(String *  args) {
        String s = "Thomas Sanchez 16";
        Scanner sc = new Scanner(s);
        System.out.println("prenom : " + sc.next() + "\nnom : " + sc.next()+ "\nage : " + sc.nextInt());
    }
}

Cool non ?

A quoi sert StringTokenizer maintenant ? J'exagère a peine cette classe peut très bien la remplacer selon moi !

Bon cette classe a l'air bien mais fait-elle des merveilles pour lire un fichier aussi ?

Essayons :

import java.io.File;

import java.io.FileNotFoundException;

import java.util.Scanner;

public class Essai {
    public static void main(String *  args) {
        Scanner sc;
        try {
            sc = new Scanner(new File("essai.txt"));
            while(sc.hasNext())
                System.out.println(sc.nextLine());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Et hop voila le fichier lu !!!

Bon ca pourrais durer longtemps pour que je vous montre toute les utilisations possible donc voila deux classe inspire de mes propres sources :

package com.daedric.net;

import java.io.*;

import java.net.*;

import java.util.Scanner;

public class Connection {

    private InputStream in;
    private PrintWriter out;
    private OutputStream outstream;
    private Scanner sc;
    public Socket sock;

    public Connection(Socket i) throws IOException {
        sock = i;
        in = sock.getInputStream();
        outstream = sock.getOutputStream();
        out = new PrintWriter(outstream, true);
        sc = new Scanner(in);
    }

    public void flush() throws IOException {
        getOutputStream().flush();
        this.out.flush();
    }

    public InputStream getInputStream() {
        return in;
    }

    public OutputStream getOutputStream() {
        return outstream;
    }

    public PrintWriter getPrintWriterStream() {
        return out;
        }

    public Scanner getScan() {
        return sc;
    }

    public Socket getSock() {
        return sock;
    }

        public void sendMes(Object Mess) {
        this.out.println(Mess);
            this.out.flush();
    }

    public void sendObj(Object Mess) {
        try {
            ObjectOutputStream out = new ObjectOutputStream(getOutputStream());
            out.writeObject(Mess);
            out.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
        }
        }
         
    public void setSock(Socket sock) {
        this.sock = sock;
    }

    public String toString() {
        return "" + sock.getInetAddress();
    }
 

    public boolean is(String ip) {
        String localIp = this.toString();

            //vive l'operateur ternaire

            return ip.compareTo(localIp = localIp.indexOf('/') > 0 ? localIp
            .substring(localIp.indexOf('/') + 1) : localIp) == 0;
    }

    // ferme toutes les connections
    public void close() {
        try {
            this.flush();
            this.getInputStream().close();
            this.getOutputStream().close();
            this.getSock().close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
}

La classe si dessus d'interagir avec une socket de la manière la plus simple possible

Je l'ai couplé un Thread avec cette classe qui a cette forme :

public class MReadingThread extends Thread {
    private Connection c;
    private Vector<fiche> vect = new Vector<fiche>();

    public MReadingThread(Connection c) {
        this.c = c;
    }

    public void run() {

        Scanner sc = c.getScan();

        for (;;) {
            String s = sc.nextLine();
            System.out.println("reception du serveur ===>" + s);
            if (s.length() > 0) {
                int sign =  new Scanner(s).nextInt(); 
                // System.out.println("sign  = " + sign);
                switch (sign) {
                    // je vous epergne quelque page de code :p
                }
            }
        }
    }
}

Simple non ? On croirait lire dans un fichier ! en plus il semble que les méthodes de Scanner soit bloquante ! Quoi demander de mieux ?

Voila une présentation des possibilités de la classe Scanner.

Je n'ai pas fait le tour je vous ai juste montre avec quoi on pouvait l'utiliser et un petit aperçu de comment le faire.

Si vous avez besoin de plus de détails allez voir la javadoc.

Pour des précisions, questions, blâme, éloges laissez des commentaires que je puisse l'améliorer.

A voir également
Ce document intitulé « La classe scanner » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.