← (précédent) A.2 Les variables (1) : les types primitifs - les constantes
A.4 Les variables (2) : opérateurs et opérations.
Accueil S O M M A I R E

A.3 La fonction System.in.read

En Java, il existe des fonctions prédéfinies de lecture. Mais elles sont délicates à manipuler pour un débutant. La plus simple d' entre elles s' appelle System.in.read(); Malheureusement, cette fonction permet de saisir un seul caractère.
Sans trop entrer dans les détails, sachez que les choses ne sont jamais simples lorsqu' il s' agit de saisir une donnée au clavier. Ce n' est pas comme le fait d' afficher avec System.out.print().
La voie la plus simple, c' est de créer ses propres fonctions de lecture à partir de System.in.read() ou à partir de toute autre fonction prédéfinie de lecture. Seulement, pour un débutant, c' est mission impossible. Il faut assimiler un certain nombres de notions et pour l' instant, nous en sommes loin. Pour cette raison, les auteurs de livre sur Java fournissent dans un cd-rom, des fonctions de lecture. J' ai donc fourni dans l' exemple zéro ci-dessous, les fonctions de l' un de ces auteurs. Ces fonctions sont regroupées dans une classe appelée Lire. Enregistrez cette classe sous l' extension Lire.java dans le même repertoire que les programmes que vous testez.
Vous pouvez faire du copier-coller.

EXEMPLE Zéro 



import java.io.*;

public class Lire
{
	// Cette fonction permet de saisir au clavier une variable de type String
    public static String chaine()
    {
	    String tmp = "";
	    char C='\0';
		try 
		{
			while ((C=(char) System.in.read()) !='\n')
			{
				if (C != '\r')  tmp = tmp+C;
		 
			}
		}
		catch (IOException e)
		{
			System.out.println("Erreur de frappe");
			System.exit(0);
		}
		return tmp;
    } 

	// Cette fonction permet de saisir au clavier une variable entière de type byte
	public static byte entierByte()  
	{
		byte x=0;
		try 
		{
			x = Byte.parseByte(chaine());
		}
		catch (NumberFormatException e) 
		{
			System.out.println("Format numérique incorrect");
			System.exit(0);
		}	
		return x ;
	}

	// Cette fonction permet de saisir au clavier une variable entière de type Short
	public static short entierShort()
	{
		short x=0;
		try 
		{
			x=Short.parseShort(chaine());
		}
		catch (NumberFormatException e) 
		{
			System.out.println("Format numérique incorrect");
			System.exit(0);
		}	
		return x ;
	 }

	// Cette fonction permet de saisir au clavier une variable entière de type int
	public static int entierInt()  
	{
		int x=0;
		try 
		{
			x=Integer.parseInt(chaine());
		}
		catch (NumberFormatException e) 
		{
			System.out.println("Format numérique incorrect");
			System.exit(0);
		}	
		return x ;
	 }
	
	// Cette fonction permet de saisir au clavier une variable entière de type long
	public static long entierLong() 
	{
		long x=0;
		try 
		{
			x=Integer.parseInt(chaine());
		}
		catch (NumberFormatException e) 
		{
			System.out.println("Format numérique incorrect");
			System.exit(0);
		}	
		return x ;
	 }

	 // Cette fonction permet de saisir au clavier une variable  réelle  double
	public  static double reelDouble()
	{
		double x=0.0;
		try 
		{
			x=Double.valueOf(chaine()).doubleValue();
		}
		catch (NumberFormatException e) 
		{
			System.out.println("Format numérique incorrect");
			System.exit(0);
		}	
		return x ;
	 }
	 
	// Cette fonction permet de saisir au clavier une variable  réelle  float
	public  static float reelFloat()
	{
		float x=0.0f;
		try 
		{
			x=Double.valueOf(chaine()).floatValue();
		}
		catch (NumberFormatException e) 
		{
			System.out.println("Format numérique incorrect");
			System.exit(0);
		}	
		return x ;
	}
	
	// Cette fonction permet de saisir au clavier une variable  de type char
	public  static char caractere()  
	{
		String tmp=chaine();
		if (tmp.length()==0)
		{
			return '\n';
		}
		else 
		{
			return tmp.charAt(0);
		}
	}
}



Commencez par remarquer l' aération du code. Les accolades appartenant au même couple sont sur la même verticale. Les verticales des accolades conteneurs et accolades contenus sont décalées par une marge. Les instructions d' un même contenu commencent toujours sur la même verticale. Que c' est agréable de voir ça.

La classe Lire ci-dessus contient des fonctions de lecture au clavier. Ce ne sont pas des fonctions prédéfinies comme la fonction System.out.print(). Ces fonctions, et donc la classe qui les contient, ont été définies par un auteur de livres sur Java. J' ai juste changé le nom des fonctions.
Ces fonctions sont déclarées à chaque fois sous une phrase précédé de //

Le double slash (//) est utilisé en JAVA pour des commentaires sur une ligne. Si vous voulez mettre des commentaires sur plusieurs lignes, vous utiliserez le /* en début de la première ligne et le */ en fin de dernière ligne.

Exemple : // Voici un commentaire sur une seule ligne
/* En voilà un autre
sur deux lignes * /
Ces caractères (// et /* ... */) permettent au compilateur JAVA de considérer ce qui suit (//) ou ce qui s' y trouve (/* */) est un commentaire. Sinon, cela sera considéré comme du code. Et comme ça ne ressemble pas du tout à un code JAVA, un message d' erreur serait renvoyé. Les commentaires sont indispensables en Java comme en tout langage de programmation. ELles permettent de trouver plus facilement ce qu' on cherche à corriger ou à modifier sur un programme.

Revenons aux fonctions de lecture de la classe Lire ci-dessus. Je disais donc que chacune de ces fonctions est définie juste en dessous d' un commentaire qui précisément indique ce que fait la fonction.
la fonction chaine() permet de lire une variable de type String. Les autres fonction sont : entierByte(), entierShort(), entierInt(), entierLong(), reelDouble(), reelFloat() et caractère() dont l' action est définie par le caractère commenté au-dessus de leur définition.

Comment utilise-t-on ces fonctions ? Des exemples bien sûr !
EXEMPLE 1 :

1. public class Lecture1 2. { 3. 4. public static void main (String [] args) 5. { 6. System.out.println("Entrez un nombre entier de type byte (entre -128 et +127) : "); 7. byte age = Lire.entierByte(); 8. System.out.println("Vous avez saisi le nombre " + age); 9. } 10. }
compilez puis exécutez ce programme. Il sera affiché :
Entrez un nombre entier de type byte (entre -128 et +127) :
Puis le curseur se met à clignoter sur la ligne suivante. Le programme attend alors que l' utilisateur entre un nombre. Si vous saisissez par exemple le nombre 40, puis vous appuyez sur la touche entrée, alors il s' affiche :
Vous avez saisi le nombre 40
La fonction System.out.println(), vous le savez déjà, vous permet d' afficher ce qui se trouve entre parenthèses. Elle affiche exactement si ce qui se trouve entre parenthèses se trouve aussi entre doubles crochets. Elle affiche le contenu de la variable dont le nom n' est pas entre doubles crochets. Ici, cette variable est age.Son contenu, c' est justement la saisie que vous aurez effectuée. L' instruction byte age = Lire.entierByte(); signifie que je déclare une variable dont le nom est age, de type byte. Puis je l' affecte d' une valeur égale à la saisie. Parce que Lire.entierByte() est une fonction de lecture.

De manière générale, l' instruction type variable = fonction de lecture(); signifie que le programme s' arrête, attend que l' utilisateur saisisse une variable au clavier. Lorsque l' utilisateur appuie alors sur la touche d' entrée, aussitôt, la valeur saisie est affectée à la variable.
EXEMPLE 2 :

1. public class Lecture2 2. { 3. 4. public static void main (String [] args) 5. { 6. System.out.println("Entrez un nombre entier de type byte (entre -128 et +127) : "); 7. byte age = Lire.entierByte(); 8. System.out.println("Vous avez saisi le nombre " + age); 9. System.out.println(); 10. System.out.println("Entrez un nombre entier de type short : "); 11. short nombreEtudiants = Lire.entierShort(); 12. System.out.println("Vous avez saisi le nombre " + nombreEtudiants); 13. System.out.println(); 14. System.out.println("Entrez un nombre entier de type int : "); 15. int populationFrance = Lire.entierInt(); 16. System.out.println("Vous avez saisi le nombre " + populationFrance); 17. System.out.println(); 18. System.out.println("Entrez un nombre de type long : "); 19. long distanceExoPlanete = Lire.entierLong(); 20. System.out.println("Vous avez saisi le nombre " + distanceExoPlanete); 21. System.out.println(); 22. System.out.println("Entrez un nombre de type float : "); 23. float tva = Lire.reelFloat(); 24. System.out.println("Vous avez saisi le nombre " + tva); 25. System.out.println(); 26. System.out.println("Entrez un nombre de type double : "); 27. double tauxLivret = Lire.reelDouble(); 28. System.out.println("Vous avez saisi le nombre " + tauxLivret); 29. System.out.println(); 30. System.out.println("Saisissez un caract\u00e8re et un seul: "); 31. char caract = Lire.caractere(); 32. System.out.println("Vous avez saisi le caract\u00e8re " + caract); 33. System.out.println(); 30. System.out.println("Saisissez une chaine de caract\u00e8res: "); 31. String ch = Lire.chaine(); 32. System.out.println("Vous avez saisi la chaine de caract\u00e8res " + ch); 33. System.out.println(); 35. 36. } 37. }
Utilisation des fonctions !

En programmation structurée, il existe deux façons d' utiliser une fonction :

Si on utilise la fonction dans la même classe où on l' a définit, on écrit simplement le nom de fonction suivi de ses parenthèses. Eventuellement les paramètres à l' intérieur des parenthèses.
Exemple : regardez la définition de la deuxième fonction de la classe Lire. C' est la fonction entierByte(). A l' intérieur de cette fonction, on utilise la première fonction, la fonction chaine(). Sur la ligne où est écrite l' instruction : x = Byte.parseByte(chaine());
Si on utilise une fonction dans une classe différente de celle dans laquelle est elle est définie, on écrit le nom de la classe, suivie d' un point, lui même suivi du nom de la fonction. Dans les exemples 1 et 2, nous avons défini les classes Lecture1 et Lecture2. Dans ces classes , nous avons utilisé les fonctions chaine(), entierByte(), entierShort(), entierInt(), entierLong(), reelFloat(), reelDouble() et caractere(). C' est pourquoi on a précisé le nom de leur classe afin que le compilateur Java puisse aller chercher ces fonctions dans la classe correpondante. C' est pourquoi on a écrit Lire.entierByte(), Lire.entierShort(), Lire.entierInt(), Lire.entierLong(), Lire.reelFloat(), Lire.reelDouble(), Lire.caractere(), Lire.chaine().

De même, la fonction System.out.print() est en réalité la fonction print() définie dans la classe System. Evidement, vous ne pouvez pas voir le code de cette classe. Car cette classe est prédéfinie par le langage Java.

La question légitime que vous vous êtes déjà posée est de savoir ce que vient faire out entre System et print. C' est la même question que vous vous poserez à savoir ce que vient faire in entre System et read. Puisque la fonction read() est définie dans la classe System.
L' explication pour l' instant n' est pas indispensable. Plus tard !
Sachez simplement que out et in représentent ce qu' on appelle en java, un flux de sortie (out) et un flux d' entrée (in).
Sur l' EXEMPLE 2 :Les lignes 6, 7 et 8 sont exactement celles de l' exemple 1. Même explication donc. Ensuite, nous avons à la ligne 8, l' instruction System.out.println(); Ici, rien dans les parenthèses de la fonctionSystem.out.println(). Ça veut dire que rien ne s' affichera. Et le curseur se placera quand même à la ligne suivante à cause de ln à la fin de print. Cette instruction permet seulement d' afficher une ligne vide pour séparer des paragraphes par exemple.
Pour les 4 lignes suivantes, même explication. Avec une différence : le type de variable change. Ainsi de suite jusqu' au bout.

Si vous essayez de mettre une valeur de type différent que la variable, il est possible que ça ne marche pas. Dans certains cas, ça marchera. Par exemple : On peut mettre une valeur type byte dans une variable de type short. Mais pas l' inverse. Pourquoi ? ... On le verra plus en détail au prochain paragraphe (1.4 opérateurs et opérations sur les variables).

← (précédent) A.2 Les variables (1) : les types primitifs - les constantes
A.4 Les variables (2) : opérateurs et opérations.
Accueil S O M M A I R E

A.3 La fonction System.in.read