package iutsud ; import java.io.BufferedReader ; import java.io.InputStreamReader ; /** * Cette classe fournit des méthodes simples pour lire les types * de base sur l'entrée standard (au clavier).

* La lecture est faite par des instructions du type : *

		int 	i = Console.readInt() ; 
 *		double 	d = Console.readDouble() ; 
 *		char 	c = Console.readChar() ;
 *			... 
* *
  • Le principe général est de lire ligne par ligne et de ne traiter * qu'une seule donnée par ligne. *
  • En cas d'erreur le programme est arrêté en levant une exception ; * il affiche alors un message d'erreur ainsi que le contenu de la pile d'exécution. *
  • L'introduction d'une ligne vide provoque une erreur sauf pour readChar() * qui renvoie le caractère de fin de ligne '\n', et sauf pour readLine() * qui renvoie la chaîne vide. *
  • La rencontre de la fin de fichier (Ctrl-D au clavier) est généralement * considérée comme une erreur sauf pour readLine() qui renvoie null. *

    * Le point de départ a été la classe sdsu.io.Console de l'université * de San Diego (http://www.eli.sdsu.edu/java-SDSU). * Cette classe a été simplifiée pour répondre à nos besoins particuliers pour * l'enseignement de l'introduction à l'algorithmique. * Le code a été entièrement remanié pour utiliser les fonctions de * conversion du langage Java. * Des améliorations pourraient certainement y être apportées en utilisant * la classe Number notamment pour les problèmes d'internationalisation, * liés à l'écriture des nombres en virgule flottante. *

    * * Utilisation :

    *

  • Le fichier Console.class se trouve sous le répertoire * /usr/local/lib/java/iutsud. *
  • La variable CLASSPATH doit contenir * /usr/local/lib/java. Sur sterne elle est initialisée * automatiquement au démarrage de la session avec cette valeur. *
  • Les classes utilisatrices doivent importer la classe * Console depuis le package iutsud par l'instruction * import iutsud.Console * * *

    Le document de présentation peut être généré depuis le source par la commande :
    * javadoc -version -author iutsud * @author Raymond Schneider * (Raymond.Schneider@iutsud.u-strasbg.fr) * @version version 0.1 17/07/98 */ public class Console { private static BufferedReader cin = new BufferedReader( new InputStreamReader( System.in )) ; private static void main(String args[]) { while (true) { System.out.print( "Print a Base "); int base = Console.readInt() ; System.out.print( "Print a Long in base " + base + " : ") ; long lb = Console.readLong(base) ; System.out.println( "You typed: " + lb ); System.out.print( "Print a Byte "); byte k = Console.readByte() ; System.out.println( "You typed: " + k ); System.out.print( "Print a Short "); int j = Console.readShort() ; System.out.println( "You typed: " + j ); System.out.print( "Print a Int "); int i = Console.readInt() ; System.out.println( "You typed: " + i ); System.out.print( "Print a Long "); long l = Console.readLong() ; System.out.println( "You typed: " + l ); System.out.print( "Print a Float "); float f = Console.readFloat() ; System.out.println( "You typed: " + f ); System.out.print( "Print a Double "); double d = Console.readDouble() ; System.out.println( "You typed: " + d ); System.out.print( "Print a Boolean "); boolean b = Console.readBoolean() ; System.out.println( "You typed: " + b ); System.out.print( "Print a Char "); char c = Console.readChar() ; System.out.println( "You typed: " + c ); } } private Console() { super() ; } /** * Exception levée lors d'une erreur de lecture */ public static class ReadException extends RuntimeException { public ReadException(String message) { super(message) ; } } // end class ReadException /** * Exception levée lors d'une erreur de conversion */ public static class ConvertionException extends RuntimeException { public ConvertionException(String message) { super(message) ; } } // end class ConvertionException /** * Quitte le programme en levant l'exception e * Le système afficheraé le message d'erreur associé * ainsi que la pile d'ecxécution * @param e l'exception à lever */ /* * Exits programs after throwing an exception * @param e exception to be thrown */ static final void exitProgram( RuntimeException e ) { throw e ; } /** * Quitte le programme suite à une erreur de conversion ; * affiche un message d'erreur en levant l'exception * Console.ConvertionException * @param s la chaîne à convertir * @param t le type vers lequel il fallait convertir */ /* * Exits programs after displaying a conversion error message * and after dumping the Thread's stack * @param s String that could not be converted * @param t Conversion Destination Type */ private static final void conversionError( String s , String t ) { exitProgram( new ConvertionException( conversionErrorMessage( s , t ) ) ) ; } /** * Quitte le programme suite à une erreur de lecture ; * affiche un message d'erreur en levant l'exception * Console.ReadException * @param s la raison de l'erreur à afficher * @param t le type lu */ /* * Exits programs after displaying a conversion error message * and after dumping the Thread's stack * @param s the error cause * @param t Read Destination Type */ private static final void readError( String s , String t ) { exitProgram( new ReadException ( s + " lors de la lecture d'un " + t) ); } /** * Compose le message d'erreur à afficher suite à une erreur de conversion ; * @param s la chaîne à convertir * @param t le type vers lequel il fallait convertir */ /* * Bulids a conversion error message * @param s String that could not be converted * @param t Conversion Destination Type */ private static String conversionErrorMessage( String s, String t ) { return '"' + s + '"' + " ne peut être convertie en " + t ; } // Input methods ---------------------------------------------------- /** * Lit une valeur booléenne dans une ligne. * Lit une ligne et détermine si elle représente true ou false. * Les valeurs possibles sont : true and false, * vrai and faux. * La comparaison est insensible à la casse (majuscule, minuscule). * * Le programme stoppe en cas d'erreur de lecture ou en fin de fichier * @return la valeur booléene correspondante. */ /* * Reads an ASCII boolean value. * It reads a word and determines if it represents true or * false. Possible values are: true and false, * vrai and faux. * The comparison is case insensitive. * Program exits on read errors or EOF * @return the boolean. */ public static boolean readBoolean() { boolean b = false ; String s ; s= readLine("boolean") ; if (s.equalsIgnoreCase(String.valueOf(false)) || s.equalsIgnoreCase("faux") ) b= false; else if (s.equalsIgnoreCase(String.valueOf(true)) || s.equalsIgnoreCase("vrai") ) b= true; else conversionError( s , "boolean" ) ; return b; } // end readBoolean /** * Lit un caractère dans une ligne. * La ligne lue doit contenir au maximum un caractère. * Si la ligne est vide le caractère '\n' est renvoyé. * * Le programme stoppe en cas d'erreur de lecture ou en fin de fichier * ou encore si la ligne contenait plusieurs caractères. * @return le caractère lu ou '\n' si la ligne était vide. */ /* * Reads one ASCII character and convert it into the internal char * format. If the line is empty '\n' is returned. * If more than one character are available in the line, only the first one is returned ; all other are * ignored. * Program exits on read errors or EOF or if more characters are available * @return the character or '\n' if line was empty. */ public static char readChar() { String s ; char c = '\n' ; s= readNewLine("char"); if (s.length() == 1) c= s.charAt(0); else if ( s.length() != 0 ) exitProgram( new ReadException( "La ligne lue contenait plus d'un caractère : " + '"' + s + '"' + '\n' ) ); return c ; } /** * Lit un nombre en virgule flottante et en double précision dans une ligne. * Ces nombres doivent être conforme à l'écriture standard des constantes * double en Java et permettre la conversion par : * Double(String).doubleValue() * Le nombre peut être précédé ou suivi d'un nombre quelconque d'espaces * (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre. * * Le programme stoppe en cas d'erreur ou en fin de fichier * @return la valeur double correspondante. */ /* * Reads an ASCII decimal floating point number. * A floating point number should obey Java String conversion : * Double(String).doubleValue() * Program exits on read errors or EOF * @return the double. */ public static double readDouble() { String s ; double d = 0.0 ; s= readLine("double"); try { d = new Double(s).doubleValue() ; } catch (NumberFormatException e) { conversionError( s, "double"); } return d ; } /** * Lit un nombre en virgule flottante et en simple précision dans une ligne. * Ces nombres doivent être conforme à l'écriture standard des constantes * float en Java et permettre la conversion par : * Float(String).floatValue() * Le nombre peut être précédé ou suivi d'un nombre quelconque d'espaces * (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre. * * Le programme stoppe en cas d'erreur ou en fin de fichier * @return la valeur float correspondante. */ /* * Reads an ASCII decimal floating point number. * A floating point number should obey Java String conversion : * Float(String).floatValue() * Program exits on read errors or EOF * @return the double. */ public static float readFloat() { String s ; float f = 0.0F ; s= readLine("float"); try { f = new Float(s).floatValue() ; } catch (NumberFormatException e) { conversionError( s, "float" ); } return f ; } /** * Lit un nombre entier dans une ligne. * Ces nombres doivent être conforme à l'écriture standard des constantes * int en Java et permettre la conversion par : * Integer.parseInt(String). * Le nombre peut être précédé ou suivi d'un nombre quelconque d'espaces * (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre. * * Le programme stoppe en cas d'erreur ou en fin de fichier * @return la valeur int correspondante. */ /* * Reads an ASCII decimal integer conforming to Integer.parseInt(String). * Integers can be preceded by optional whitespace (SPACE or TAB). * Program exits on read errors or EOF * @return the integer. */ public static int readInt() { int i = 0 ; String s ; s= readLine("int"); try { i = Integer.parseInt(s) ; } catch (NumberFormatException e) { conversionError( s, "int" ); } return i ; } /** * Lit un nombre entier long écrit en base b dans une ligne. * Ces nombres doivent être conforme à l'écriture standard des constantes * long en Java et permettre la conversion par : * Long.parseLong(String,b) * Le nombre peut être précédé ou suivi d'un nombre quelconque d'espaces * (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre. * * Le programme stoppe en cas d'erreur ou en fin de fichier * @param b la base dans laquelle l'entier lu est exprimé * @return la valeur long correspondante. */ /* * Reads an ASCII long expressed in base b and conforming * to Long.parseLong(String,b) * Longs can be preceded by optional whitespace (SPACE or TAB). * Program exits on read errors or EOF * @param b the numbering base used to make the conversion * @return the long. */ public static long readLong(int b) { long l = 0L; String s ; String t = "long" ; if ( b != 10) t= t + " in base " + b ; s= readLine(t); try { l = Long.parseLong(s, b) ; } catch (NumberFormatException e) { conversionError( s, t) ; } return l ; } /** * Lit un nombre entier long dans une ligne. * Ces nombres doivent être conforme à l'écriture standard des constantes * long en Java et permettre la conversion par : * Long.parseLong(String) * Le nombre peut être précédé ou suivi d'un nombre quelconque d'espaces * (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre. * * Le programme stoppe en cas d'erreur ou en fin de fichier * @return la valeur long correspondante. */ /* * Reads an ASCII decimal long conforming to Long.parseLong(String) * Longs can be preceded by optional whitespace (SPACE or TAB). * Program exits on read errors or EOF * @return the long. */ public static long readLong() { return readLong(10) ; } /** * Lit un nombre entier court dans une ligne. * Ces nombres doivent être conforme à l'écriture standard des constantes * short en Java et permettre la conversion par : * Short.parseShort(String) * Le nombre peut tre preécédé ou suivi d'un nombre quelconque d'espaces * (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre. * * Le programme stoppe en cas d'erreur ou en fin de fichier * @return la valeur short correspondante. */ /* * Reads an ASCII decimal short. * Shorts can be preceded by optional whitespace (SPACE or TAB). * Program exits on read errors or EOF * @return the short. */ public static short readShort() { short j = 0 ; String s = readLine("short"); try { j = Short.parseShort(s) ; } catch (NumberFormatException e) { conversionError( s, "short" ); } return j ; } /** * Lit un octet dans une ligne. * Ces nombres doivent être conforme à l'écriture standard des constantes * byte en Java et permettre la conversion par : * Byte.parseByte(String) * Le nombre peut être précédé ou suivi d'un nombre quelconque d'espaces * (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre. * * Le programme stoppe en cas d'erreur ou en fin de fichier * @return la valeur byte correspondante. */ /* * Reads an ASCII decimal byte. * Bytes can be preceded by optional whitespace (SPACE or TAB). * Program exits on read errors or EOF * @return the byte. */ public static byte readByte() { byte b = 0 ; String s = readLine("byte"); try { b = Byte.parseByte(s) ; } catch (NumberFormatException e) { conversionError( s, "byte" ); } return b ; } /** * Lit une ligne. * * Le programme stoppe en cas d'erreur de lecture. * @return une chaîne indiquant le contenu de la ligne ou * une chaîne vide lorsque la ligne était vide ou * null en fin de fichier . */ /* * Reads a line. * Program exits on read errors * @return the line content or an empty string if nothing entered or null if EOF reached . */ public static String readLine() { String s = null ; try { s= cin.readLine(); } catch ( java.io.EOFException error) { s = null ; } catch ( Exception error ) { exitProgram( new RuntimeException(error.toString()) ) ; } return s ; } /** * Lit une nouvelle ligne. * * Le programme stoppe en cas d'erreur de lecture ou si la fin de fichier * est rencontrée. * @param t chaîne indiquant le type de la donnée lue dans cette ligne * @return une chaîne indiquant le contenu de la ligne ou * une chaîne vide lorsque la ligne était vide . */ /* * Reads a new line. * Program exits on read errors or if EOF is reached. * @param t String indicating the type expected in the line * @return the line content or an empty string if nothing entered . */ private static String readNewLine(String t) { String s ; s= readLine() ; if ( s == null) readError ( " Fin de fichier inattendue" , t) ; return s ; } /** * Lit une donnée de type t dans une ligne non vide. * * Le programme stoppe en cas d'erreur de lecture, de fin de fichier * ou si la ligne était vide. * @param t chaîne indiquant le type de la donnée lue dans cette ligne * @return une chaîne indiquant le contenu non vide de la ligne. */ /* * Reads a data of type t in a non empty line. * Program exits on read errors or EOF or if line is empty * @param t String indicating the type expected in the line * @return the non empty line content */ private static String readLine(String t) { String s ; s= readNewLine(t).trim() ; if (s.length() == 0) readError ( " Ligne vide" , t) ; return s ; } } // end class Console