begin process at 2010 02 09 19:52:21
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Astuces

 > LA CLASSE SCANNER

LA CLASSE SCANNER


 Information sur le tutoriel

Note :
Aucune 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.

 

 

 Historique

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

Commentaires

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 , ... ?

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 !

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

++

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

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 ...

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)

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

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.

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

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

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?

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

Commentaire de jadu le 08/12/2008 11:46:20

Est-ce que ceci est toujours valable ?
depuis 2007 çà a évolué sans doute !

Quelqu'un peut me dire si il y a mieux maintenant ?

Commentaire de sheorogath le 08/12/2008 13:02:46 administrateur CS

Ben non c'est pareil a moins que tu trouves une classe equivalente qui fais ce qu'elle fait en mieux

Donc c'est toujours d'actualite ...

Commentaire de GillesWebmaster le 17/04/2009 21:53:48

super tutorial!

Commentaire de GillesWebmaster le 17/04/2009 21:54:40

10/10 (apparemment la note ne s'affiche pas!)

Commentaire de sheorogath le 18/04/2009 10:35:26 administrateur CS

:) merci

Commentaire de Law44 le 01/06/2009 10:04:21

impec => la seule façon d'évoluer c'est de faire partager son savoir et pq pas via des tuto...

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,234 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales