Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LA CLASSE SCANNER


Information sur le tutorial

Catégorie :Astuces Date de création : 04/09/2006 18:37:02 Vu : 12 933 fois

Note :
Aucune note

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note


Description

Cette classe a elle seule merite un tutorial dedié...
elle permet de lire a peu pres n'importe quoi n'importe où!

Tutorial

                                                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?as 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 vect = new Vector();

 

            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.

 

 

04 septembre 2006 18:38:30 :
modifications de la categorie et correction d'un bug de mise a page
10 septembre 2006 20:36:52 :
petite amelioration niveau presentation
signaler à un administrateur
Commentaire de Twinuts le 05/09/2006 09:31:09 administrateur CS

Salut,

sympas, bien que trop espacé à mon gout mais bon c'est un detail :D, je me demande toujours pourquoi tu le sort justement le 04/09 le tutos (looool),
par contre je m'ettone de ne pas voir de passage sur les pattern (huhu je suis méchant la :P)


PS:Tu as des problèmes avec les ' pourquoi ecrire n?ai au lieu de n'ai , ... ?

signaler à un administrateur
Commentaire de Bidou le 05/09/2006 13:35:35 administrateur CS

Bien ;-)
Mais la mise en page ne joue pas du tout, y'a une immense barre horizontale !

signaler à un administrateur
Commentaire de sheorogath le 05/09/2006 18:56:48 administrateur CS

mdr la mise en page dites merci word :p

je l'avais mis pour la detection des erreus lol

pour les pattern j'attend d'avoir resolu mon propre probleme lol :p
qu'est ce que c'est chiant ces regexp lol

allez peut etre que se soir je revois la mise en forme mais je ne supporte pas
leur TextBox lol

++

signaler à un administrateur
Commentaire de jannoman le 12/03/2007 13:23:36

c'est vrai que ca a l'air sympa du coup pour lire un fichier !!
mais pour écrire dans un fichier ?
ca aurait été sympa pour les débutants comme moi que tu epargnes ton truc avec le socket (je ne sais pas ce que c'est) ou alors que tu dises avant à quoi ca sert.
merci
bonne continuation
Thomas

signaler à un administrateur
Commentaire de sheorogath le 13/03/2007 18:58:21 administrateur CS

une socket pour faire simple represente une connection sur un pc distant

sinon tu ne peux pas ecrire avec , pour ma part j'ai l'impression d'avoir fait simple...
du moins je peux pas faire mieux ...

signaler à un administrateur
Commentaire de GodConan le 07/07/2007 09:31:37

je suis content ;o) je vien grace à ce tuto d apprendre une class qui m avait échappée
par contre a la question "A quoi sert StringTokenizer maintenant ?"
regarder le source de chaqu une des 2 class (3 avec Patern) suffit à voir que StringTokenizer reste encors tres util ;o)

signaler à un administrateur
Commentaire de sheorogath le 07/07/2007 12:38:11 administrateur CS

c'est vrai ^^ mais Scanner est une classe sublime je trouve ^^
je l'utilise pour lire mon clavier et mes socket

signaler à un administrateur
Commentaire de zarkofaj le 14/10/2007 21:30:59

C'est bien le tuto. On peut faire bien avec simplicité . . . et tu nous a épargner quelques pages.
Bon J'aimerais savoir où trouver de très bonne études sur java en ligne en dehors de java.fr.
Merci d'avance si je reçoit conseil. J'ai apprécié Scanner la String avec un Int à l'intérieur.
C'est vraiment cool! .
| DM Qc Canada.

signaler à un administrateur
Commentaire de sheorogath le 15/10/2007 00:09:33 administrateur CS

ta le tuto de jmdoudou sur internet
il est dispo en telechagement

signaler à un administrateur
Commentaire de MrEske le 10/12/2007 01:03:47

Salut!
Bon, toujours le commentaire sur la mise en page, sympa la ligne d'un mètre de long.

Par contre j'ai pas compris la méthode is avec l'"opérateur ternaire", tu peux l'expliquer s'il te plait?
Et autre chose, c'est quoi une méthode bloquante?

signaler à un administrateur
Commentaire de sheorogath le 10/12/2007 10:39:31 administrateur CS

le ternaire :

condition ? return si condition vrai : return si condition fausse;

sinon une methode bloquant bloque l'execution du processus courant tant qu'elle na pas fini de s'executer

sinon pour la mise en page a falloir que je prenne le temps de le faire ....

bonne journee

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,031 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.